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 無限播放音樂;