之前写了两篇文章,分别是在活动中创建通知和在广播接收器中创建通知,今天再来写一篇在服务中创建通知----也就是所谓的前台service。


从Android8.0开始,只有当应用保持在前台可见状态下,service才能保证稳定运行,一旦应用进入了后台,service可能随时会被回收。所以可以考虑使用前台service,它和普通是service的最大区别就是,它一直会有一个正在运行的图标在系统的状态栏显示,下拉状态栏可以看到更详细的信息,和通知的效果很像,


其实就是在服务中创建了通知而已,点击它可以进去指定的APP活动。

先来看看效果吧

在服务中创建通知-----实现前台服务_android

代码实现

1.MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button start=findViewById(R.id.start_service);
Button stop=findViewById(R.id.stop_service);
start.setOnClickListener(this);
stop.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.start_service:
Intent startIntent=new Intent(MainActivity.this,MyService.class);
startService(startIntent);
break;
case R.id.stop_service:
Intent stopIntent =new Intent(MainActivity.this,MyService.class);
stopService(stopIntent);
break;
}
}
}

2.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:layout_gravity="center"
tools:context=".MainActivity">

<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/start_service"
android:text="开启服务"/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/stop_service"
android:text="停止服务"/>

</LinearLayout>

3.MyService.java

public class MyService extends Service {
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
super.onCreate();
Log.d("MyService","onCreate");
NotificationChannel notificationChannel = null;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
notificationChannel = new NotificationChannel("important", "Important", NotificationManager.IMPORTANCE_LOW);
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
assert notificationManager != null;
notificationManager.createNotificationChannel(notificationChannel);
}
Intent intent=new Intent(this,MainActivity.class);
PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
Notification notification=new NotificationCompat.Builder(this,"important")
.setContentTitle("前台服务")
.setContentText("app正在运行")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pi)
.build();

startForeground(1,notification);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService","onStartCommand");
return super.onStartCommand(intent, flags, startId);

}

@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyService","onDestroy");
}
}

4.在manifest的​​<application​​前面添加申请前台服务权限:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

在 ​​<application​​里面添加注册服务代码

<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />

整个manifest参考:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.servicetest">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="AllowBackup,GoogleAppIndexingWarning">
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

GitHub:https://github.com/wangjinchan/ServiceTest

参考:郭霖的《第一行代码》第三版 kotlin