1、前台服务
package com.ivan.myapplication;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
/**
* 描述:延长服务存活时间的基类
* <p>
*
* @author ivan
* @date 2019/08/09
*/
public class MyForegroundService extends Service {
public static final int NOTIFICATION_ID = 0x11;
private final static String TAG = "MyForegroundService";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, TAG + "---->onCreate,启动服务");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//API 18以下,直接发送Notification并将其置为前台
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
startForeground(NOTIFICATION_ID, new Notification());
} else {
//API 18以上,发送Notification并将其置为前台
NotificationCompat.Builder builder = getNotificationCompatBuilder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setWhen(System.currentTimeMillis());
builder.setAutoCancel(true);
startForeground(NOTIFICATION_ID, builder.build());
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
Log.d(TAG, TAG + "---->onDestroy,停止服务");
}
public static NotificationCompat.Builder getNotificationCompatBuilder(Context context) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channel_id = "channel_id";
NotificationChannel channel = new NotificationChannel(channel_id, "channel_name",
NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
return new NotificationCompat.Builder(context, channel_id);
} else {
return new NotificationCompat.Builder(context, null);
}
}
}
2、播放无声音乐
package com.ivan.myapplication;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
/**
* 描述:app保活服务类
* <p>
*
* @author ivan
* @date 2019/08/09
*/
public class KeepLiveService extends MyForegroundService {
private final static String TAG = "KeepLiveService";
private MediaPlayer mMediaPlayer;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, TAG + "---->onCreate,启动服务");
mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.wusheng);
mMediaPlayer.setLooping(true);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent,flags,startId);
new Thread(new Runnable() {
@Override
public void run() {
startPlayMusic();
}
}).start();
return START_STICKY;
}
private void startPlayMusic() {
if (mMediaPlayer != null) {
Log.d(TAG, "启动后台播放音乐");
mMediaPlayer.start();
}
}
private void stopPlayMusic() {
if (mMediaPlayer != null) {
Log.d(TAG, "关闭后台播放音乐");
mMediaPlayer.stop();
}
}
@Override
public void onDestroy() {
super.onDestroy();
stopPlayMusic();
Log.d(TAG, TAG + "---->onDestroy,停止服务");
}
}
3、注册服务
<service android:name=".KeepLiveService" android:enabled="true" android:exported="true" android:process=":daemon_service" />
4、在自定义的application加入以下代码:app处于后台时启动保活服务,处于前台时关闭保活服务
Intent mKeepLiveServiceIntent = new Intent(this,KeepLiveService.class);
registerActivityLifecycleCallbacks(new ActivityLifecycleListener());
private static class ActivityLifecycleListener implements ActivityLifecycleCallbacks{
private int refCount = 0;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
refCount++;
if(refCount != 0){//不为0表示应用处于前台
//关闭保活服务
if(mKeepLiveServiceIntent != null){
getInstance().stopService(mKeepLiveServiceIntent);
}
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
refCount--;
if(refCount == 0){//0表示应用处于后台
//启动保活服务
if(mKeepLiveServiceIntent != null){
getInstance().startService(mKeepLiveServiceIntent);
}
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
5、总结
(1)通过以下步骤,可以延长app处于后台时的存活时间;
(2)手动kill掉app后,service也就死了;
(3)只有用户把app加入了白名单,service被kill掉后才会重启,变量存储的数据都会消失。