service 是一个后台服务 专门用来处理常驻后台的工作的组件,经常会被用在及时通讯,通知等场景。 它的优化主要体现在两个方面:1.服务的保活,2.服务后台对于执行任务的集中管理.
进程的重要性优先级
1 前台进程 Foreground process
1 用户正在交互的Activity(onResume)
2 当某个Service绑定正在交互Activity
3 被主动调用为前台Service(startForeground)
4 组件正在执行生命周期的回调
5 BrocastReceiver 正在执行onReceive()
2 可见进程 Visible process
1我们 的Activity处在onPause()
2 绑定到前台Activity的Service
3 服务进程 Service process
statService() 启动
4 后台进程 Background process
对用户没有直接影响的进程 Activity 处于 onStop的时候
android:process=":xxx"
5 空进程 Empty process
不含有任何活动的组件 android设计 第二次启动更快
如何提升进程的优先级,主要是为了减少被系统杀掉的概率。
1. 提高进程优先级,一般是通过减少进程oom_adj值,如启动进程的setForeground()提高进程优先级
2. java层双进程守护,在应用启动的时候,开启两个进程的服务,一个用来执行业务,一个用来监控业务服务,一旦被系统干掉,就立即重启业务服务,需要注意的是,业务服务的一些状态的保存,以及再次重启后状态如何恢复的处理。
3.1个像素的Activity保活,监控锁屏广播,在锁屏的时候启动一个 1个像素Activity 解锁后 结束这个Activity 重启服务。
4. JobScheduler轮询
import android.app.ActivityManager;
import android.app.Service;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
import java.util.List;
public class JobHandleService extends JobService {
private int kJobId =0;
public static String TAG= "LJT";
public JobHandleService() {
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: ");
}
@Override
public boolean onStartJob(JobParameters params) {
boolean serviceLocalWork = isServiceWork(this, "com.ljt.servicemanager.LocalService");
boolean serviceRemoteWork = isServiceWork(this, "com.ljt.servicemanager.RemoteService");
Log.i(TAG, "localSericeWork:"+serviceLocalWork);
Log.i(TAG, "remoteSericeWork:"+serviceRemoteWork);
if(!serviceLocalWork || ! serviceRemoteWork) {
this.startService(new Intent(this,LocalService.class));
this.startService(new Intent(this,RemoteService.class));
Toast.makeText(this, " JobService process start", Toast.LENGTH_SHORT).show();
}
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.i(TAG, "onStopJob:");
scheduleJob(getJobInfo());
return true;
}
public void scheduleJob(JobInfo t) {
Log.i(TAG, "scheduleJob:");
JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
tm.schedule(t);
}
public JobInfo getJobInfo() {
JobInfo.Builder builder = new JobInfo.Builder(kJobId++, new ComponentName(this, JobHandleService.class));
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPersisted(true);
builder.setRequiresCharging(false);
builder.setRequiresDeviceIdle(false);
builder.setPeriodic(10); // 间隔时间--周期
return builder.build();
}
//判断某个服务是否正在运行的方法
public boolean isServiceWork(Context mContext,String serviceName) {
boolean isWork = false;
ActivityManager myAM = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> myList = myAM.getRunningServices(100);
if(myList.size() <=0) {
return false;
}
for(int i=0;i< myList.size(); i++) {
String mName = myList.get(i).service.getClassName().toString();
if(mName.equals(serviceName)) {
isWork = true;
break;
}
}
return isWork;
}
}
5.native层双进程守护
6 无限播放音乐;