在Android开发中有些应用需要让应用的服务在后台运行不被杀死。下面介绍两种方法。但是这两种方法一起用只能拉活7.0以下的系统上的应用。
一,使用开锁屏广播拉活。
在模拟器上面所有版本的Android系统在进程被杀死后都可以接受到开锁屏广播。
真正的手机上面,小于等于5.0的手机在进程被杀死后可以接受到开锁屏广播。大于5.0在进程被杀死后就不能接受开锁屏广播了。
二,使用JobService保活。
JobService在5.0 5.1和6.0的手机可以起到服务拉活的作用。之后的版本就不能起效果了。包括模拟器测试效果一样。对于7.0 7.1和8.0 8.1的手机实现服务保活目前就没有办法了。qq和微信和手机生产厂商有合作所有能被拉活,在设置为允许自启的情况下。
1,在AndroidManifest里面添加广播的过滤标签。
2,创建ScreenReceiver广播接受类。在接受广播后拉活服务。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.example.admin.jobservices.StaticMethodTool;
/**
* 开锁屏广播
*/
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
StaticMethodTool.starSer(context);
}
}
MyJobService类的实现
import android.annotation.TargetApi;
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.Build;
import android.util.Log;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {
private int kJobId = 0;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
scheduleJob(getJobInfo());
return START_NOT_STICKY;
}
@Override
public boolean onStartJob(JobParameters params) {
Log.e("JOBSERVICE", "onStartJob +++");
String sName = WorkService.class.getName();
boolean isLocalServiceWork = StaticMethodTool.isServiceRunning(sName, this);//此处填入服务的全名
if (!isLocalServiceWork) {
this.startService(new Intent(this, WorkService.class));
}
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.e("JOBSERVICE", "onStopJob +++");
scheduleJob(getJobInfo());
return true;
}
//将任务作业发送到作业调度中去
public void scheduleJob(JobInfo t) {
JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
tm.schedule(t);
}
public JobInfo getJobInfo() {
JobInfo.Builder builder = new JobInfo.Builder(kJobId++, new ComponentName(this, MyJobService.class));
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
// builder.setPersisted(true);//手机重启
builder.setRequiresCharging(false);
builder.setRequiresDeviceIdle(false);
//间隔1000毫秒
builder.setPeriodic(1000);
return builder.build();
}
}
用于处理事件的服务WorkService
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
/**
* 用于正式运行处理事件的服务
*/
public class WorkService extends Service {
long i = 0L;
public void onCreate() {
super.onCreate();
i = 0;
new Thread() {
@Override
public void run() {
super.run();
while (true) {
try {
Thread.sleep(1000);
} catch (Exception e) {
}
Log.e("JOBSERVICE", "WorkService 服务没有死" + (i++));
}
}
}.start();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
AndroidManifest里面的服务标签配置
启动MyJobService示例代码
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;
import java.util.List;
/**
* Created by lenovo on 2018/6/19.
* 公共方法。
*/
public class StaticMethodTool {
/**
* 启动服务
*
* @param mAct
*/
public static void starSer(Context mAct) {
if (Build.VERSION.SDK_INT > 20 && Build.VERSION.SDK_INT < 24) {//JobService只支持21,22,23 也就是5.0 5.1 6.0的系统
if (!isServiceRunning("" + WorkService.class.getName(), mAct)) {
Intent intent1 = new Intent(mAct, MyJobService.class);
intent1.setAction("myaction");
mAct.startService(intent1);
} else {
Log.e("JOBSERVICE", "5.0以上手机版本 服务运行中+++");
}
} else {
if (!isServiceRunning(WorkService.class.getName(), mAct)) {
Intent intent1 = new Intent(mAct, WorkService.class);
mAct.startService(intent1);
} else {
Log.e("JOBSERVICE", "5.1以下的手机版本 服务运行中+++");
}
}
}
/**
* 判断服务是否处于运行状态.
*
* @param servicename
* @param context
* @return
*/
public static boolean isServiceRunning(String servicename, Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List infos = am.getRunningServices(100);
for (ActivityManager.RunningServiceInfo info : infos) {
if (servicename.equals(info.service.getClassName())) {
return true;
}
}
return false;
}
}
MainActiviy类
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout rlParents = new RelativeLayout(this.getApplicationContext());
TextView tv = new TextView(this.getApplicationContext());
tv.setText("Hello MainActivity");
tv.setTextSize(50);
rlParents.addView(tv);
setContentView(rlParents);
Button buttonTiao = new Button(this.getApplicationContext());
RelativeLayout.LayoutParams rlButton = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
rlButton.addRule(RelativeLayout.CENTER_IN_PARENT);
rlParents.addView(buttonTiao, rlButton);
buttonTiao.setText("启动JobService");
buttonTiao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//启动制定App的指定页面
StaticMethodTool.starSer(MainActivity.this);
}
});
}
}
应用保活与拉活Demo