1.关于进程守护无非就是6.0以下,6.0以上的高版本保活

a.android中6.0以下的保护采用双线程守护即可是aidl

(1)创建aidl文件

     interface IServiceAidlInterface {String getServiceName(); }(2)创建本地service是LocalService类实现aidl接口
public class LocalService extends Service {MyBinder binder;MyConn conn;@Nullable@Overridepublic IBinder onBind(Intent intent) {return binder;}@Overridepublic void onCreate() {super.onCreate();binder = new MyBinder();conn = new MyConn();}class MyBinder extends IServiceAidlInterface.Stub {@Overridepublic String getServiceName() throws RemoteException {return LocalService.class.getSimpleName();}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Toast.makeText(LocalService.this, " 本地服务活了", Toast.LENGTH_SHORT).show();this.startService(new Intent(LocalService.this,RomoteService.class));this.bindService(new Intent(LocalService.this,RomoteService.class),conn, Context.BIND_IMPORTANT);return START_STICKY;}class MyConn implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.i("box", "绑定上了远程服务");}@Overridepublic void onServiceDisconnected(ComponentName name) {Log.i("box", "远程服务被干掉了");Toast.makeText(LocalService.this, "远程服务挂了", Toast.LENGTH_SHORT).show();//开启远程服务LocalService.this.startService(new Intent(LocalService.this,RomoteService.class));//绑定远程服务LocalService.this.bindService(new Intent(LocalService.this,RomoteService.class),conn,Context.BIND_IMPORTANT);}}@Overridepublic void onDestroy() {super.onDestroy();//开启远程服务LocalService.this.startService(new Intent(LocalService.this,RomoteService.class));//绑定远程服务LocalService.this.bindService(new Intent(LocalService.this,RomoteService.class),conn,Context.BIND_IMPORTANT);}private void show() {final Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {Toast.makeText(LocalService.this, "本地服务正常", Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};Timer timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic void run() {Message message = new Message();message.what = 1;handler.sendMessage(message);}};timer.schedule(task, 2000, 2000);}}

(3)创建一个RomoteService服务分别实现aidl接口的调用

public class RomoteService extends Service{MyConn conn;MyBinder binder;@Nullable@Overridepublic IBinder onBind(Intent intent) {return binder;}@Overridepublic void onCreate() {super.onCreate();conn = new MyConn();binder = new MyBinder();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {show();Toast.makeText(this, " 远程服务活了", Toast.LENGTH_SHORT).show();this.bindService(new Intent(this, LocalService.class), conn, Context.BIND_IMPORTANT);return START_STICKY;}class MyBinder extends IServiceAidlInterface.Stub {@Overridepublic String getServiceName() throws RemoteException {return RomoteService.class.getSimpleName();}}class MyConn implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.i("box", "绑定本地服务成功");// Toast.makeText(RomoteService.this, "绑定本地服务成功", Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceDisconnected(ComponentName name) {Log.i("box", "本地服务被干掉了");Toast.makeText(RomoteService.this, "本地服务挂了", Toast.LENGTH_SHORT).show();//开启本地服务RomoteService.this.startService(new Intent(RomoteService.this, LocalService.class));//绑定本地服务RomoteService.this.bindService(new Intent(RomoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);}}@Overridepublic void onDestroy() {super.onDestroy();//开启本地服务RomoteService.this.startService(new Intent(RomoteService.this, LocalService.class));//绑定本地服务RomoteService.this.bindService(new Intent(RomoteService.this, LocalService.class), conn,Context.BIND_IMPORTANT);}private void show() {final Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {Toast.makeText(RomoteService.this, "远程服务正常", Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};Timer timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic void run() {Message message = new Message();message.what = 1;handler.sendMessage(message);}};timer.schedule(task, 2000, 2000);}
}

(4)可以监听系统的某些动作来实现监听,判断LocalService和RomoteService是否还在进行,这儿我写了一个工具类判断当前服务是否还在进行和判断当前包名是否也还在进行当中

/*** 判断本应用是否存活* 如果需要判断本应用是否在后台还是前台用getRunningTask*/
public static boolean isAPPALive(Context mContext, String packageName) {boolean isAPPRunning = false;// 获取activity管理对象ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);// 获取所有正在运行的appList<ActivityManager.RunningAppProcessInfo> appProcessInfoList = activityManager.getRunningAppProcesses();// 遍历,进程名即包名for (ActivityManager.RunningAppProcessInfo appInfo : appProcessInfoList) {if (packageName.equals(appInfo.processName)) {isAPPRunning = true;break;}}return isAPPRunning;
}
/*** 判断某个服务是否正在运行的方法** @param serviceName 是包名+服务的类名(例如:net.loonggg.testbackstage.TestService)* @return true代表正在运行,false代表服务没有正在运行*/
public static boolean serviceAlive(Context context, String serviceName) {boolean isWork = false;ActivityManager myAM = (ActivityManager) context.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).可以创建单个的1像素Activity在页面监听

public class SinglePixelActivity extends AppCompatActivity {private static final String TAG = "SinglePixelActivity";@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate--->启动1像素保活");Window mWindow = getWindow();mWindow.setGravity(Gravity.LEFT | Gravity.TOP);WindowManager.LayoutParams attrParams = mWindow.getAttributes();attrParams.x = 0;attrParams.y = 0;attrParams.height = 300;attrParams.width = 300;mWindow.setAttributes(attrParams);// 绑定SinglePixelActivity到ScreenManagerScreenManager.getScreenManagerInstance(this).setSingleActivity(this);}
锁屏工具类
public class ScreenReceiverUtil {private Context mContext;// 锁屏广播接收器private SreenBroadcastReceiver mScreenReceiver;// 屏幕状态改变回调接口private SreenStateListener mStateReceiverListener;public ScreenReceiverUtil(Context mContext){this.mContext = mContext;}public void setScreenReceiverListener(SreenStateListener mStateReceiverListener){this.mStateReceiverListener = mStateReceiverListener;// 动态启动广播接收器this.mScreenReceiver = new SreenBroadcastReceiver();IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_ON);filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_USER_PRESENT);mContext.registerReceiver(mScreenReceiver,filter);}public void stopScreenReceiverListener(){mContext.unregisterReceiver(mScreenReceiver);}public  class SreenBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();Log.d("KeepAppAlive","SreenLockReceiver-->监听到系统广播:"+action);if(mStateReceiverListener == null){return;}if(Intent.ACTION_SCREEN_ON.equals(action)){         // 开屏mStateReceiverListener.onSreenOn();}else if(Intent.ACTION_SCREEN_OFF.equals(action)){  // 锁屏mStateReceiverListener.onSreenOff();}else if(Intent.ACTION_USER_PRESENT.equals(action)){ // 解锁mStateReceiverListener.onUserPresent();}}}// 监听sreen状态对外回调接口public interface SreenStateListener {void onSreenOn();void onSreenOff();void onUserPresent();}
}

2.针对于android中7.0以上的手机采用jobservice

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class JobWakeUpService extends JobService {private int JobWakeUpId = 1;@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//开启轮寻JobInfo.Builder mJobBulider = new JobInfo.Builder(JobWakeUpId, new ComponentName(this, JobWakeUpService.class));//        //设置轮寻时间mJobBulider.setPeriodic(15 * 60 * 1000);//系统当你的设备重启之后你的任务是否还要继续执行mJobBulider.setPersisted(true);  // 设置设备重启时,执行该任务mJobBulider.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);mJobBulider.setRequiresCharging(true); // 当插入充电器,执行该任务JobScheduler mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);JobInfo info = mJobBulider.build();mJobScheduler.schedule(info); //开始定时执行该系统任务return START_STICKY;}@Overridepublic boolean onStartJob(JobParameters jobParameters) {Log.e("aa", "-----------onStartJob-------");//开启定时任务 定时轮寻 判断应用Service是否被杀死//如果被杀死则重启ServicemJobHandler.sendMessage(Message.obtain(mJobHandler, 1, jobParameters));return false;}@Overridepublic boolean onStopJob(JobParameters jobParameters) {Log.e("aa", "-----------onStopJob-------");mJobHandler.removeMessages(1);return true;}private Handler mJobHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {

//这儿是列举的获取数据这样传递值过去的

           Intent intent = new Intent();intent.putExtra(AppHawkey.LONGITUDE_KEY, longitude);intent.putExtra(AppHawkey.LATITUDE_KEY, latitude);LocationService.enqueueWork(getApplicationContext(), intent);jobFinished((JobParameters) msg.obj, false);return true;}});对了针对于上面的你在service中获取的数据最好是用JobIntentService,具体原因是抛了一个错误,crash

java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.xxx.xx/.core.service.NotifyJobService }: app is in background uid UidRecord{6dd5849 u0a172 TPSL idle change:idle|cached procs:1 seq(0,0,0)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1628)
at android.app.ContextImpl.startService(ContextImpl.java:1569)
at android.content.ContextWrapper.startService(ContextWrapper.java:675)
at com.xxx.xx.application.MainApp.onCreate(Unknown Source:385)
at com.baidu.protect.A.a(Native Method)
at com.baidu.protect.StubApplication.onCreate(StubApplication.java:296)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6273) ... 8 more

在android系统8.0以上适配请添加以下权限

使用示例:
1.在Manifest中声名Permission:
<uses-permission android:name="android.permission.WAKE_LOCK" />
2.在Manifest中声名Service:

<service android:name=".service.LocationService"android:permission="android.permission.BIND_JOB_SERVICE"/>  

3.实现JobIntentService类:

public class LocationService extends JobIntentService {/*** 这个Service 唯一的id*/static final int JOB_ID = 10111;/*** Convenience method for enqueuing work in to this service.*/static void enqueueWork(Context context, Intent work) {enqueueWork(context, LocationService.class, JOB_ID, work);LocationUtil.isOpen=true;}@Overrideprotected void onHandleWork(@NonNull Intent intent) {double longitude = intent.getDoubleExtra(AppHawkey.LONGITUDE_KEY, 0.00);double latitude = intent.getDoubleExtra(AppHawkey.LATITUDE_KEY, 0.00);LogUtil.e("-------longitude------" + longitude);LogUtil.e("-------latitude------" + latitude);String locationKey = PreferenceUtils.getString(AppHawkey.LOCATION_SAVE_KEY, "");if (!TextUtils.isEmpty(locationKey)) {UploadLoaction loaction = JsonUtil.fromJson(locationKey, UploadLoaction.class);if (loaction.getLocations() != null && loaction != null) {List<UploadLoaction.location> data = new ArrayList<>();data.addAll(loaction.getLocations());UploadLoaction.location item = new UploadLoaction.location();item.setLongitude(longitude);item.setLatitude(latitude);data.add(item);loaction.setLocations(data);String toJson = JsonUtil.toJson(loaction);toast(toJson);PreferenceUtils.setString(AppHawkey.LOCATION_SAVE_KEY, toJson);}} else {UploadLoaction loaction = new UploadLoaction();List<UploadLoaction.location> data = new ArrayList<>();UploadLoaction.location item = new UploadLoaction.location();item.setLatitude(latitude);item.setLongitude(longitude);data.add(item);loaction.setLocations(data);String toJson = JsonUtil.toJson(loaction);toast(toJson);PreferenceUtils.setString(AppHawkey.LOCATION_SAVE_KEY, toJson);}}final Handler mHandler = new Handler();// Helper for showing testsvoid toast(final CharSequence text) {mHandler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(LocationService.this, text, Toast.LENGTH_SHORT).show();}});}
}

关于android双进程守护-后台持续定位功能+项目IM中写到自己的即时通讯相关推荐

  1. H5+App后台持续定位功能实现

    H5+App后台持续定位功能实现 1. 项目需求 2. 实现过程 3.最终实现 4. 关于测试用例 1. 项目需求 最近有个需求就是需要完成在后台的实时定位,并且要将获取到的定位信息写到Map控件上去 ...

  2. 微信小程序后台持续定位功能使用

    微信小程序团队在7月30日更新了 基础库 2.8.0 其中新添加了小程序后台持续定位功能和联系定位的接口 从上到下分别是 1.wx.onLocationChange//监听位置实时变化 2.wx.st ...

  3. 微信小程序后台持续定位功能使用详解

    微信小程序团队在7月30日更新了 基础库 2.8.0 其中新添加了小程序后台持续定位功能和联系定位的接口 从上到下分别是 1.wx.onLocationChange//监听位置实时变化 2.wx.st ...

  4. android双进程守护耗电,Android实现双进程守护

    做过android开发的人应该都知道应用会在系统资源匮乏的情况下被系统杀死!当后台的应用被系统回收之后,如何重新恢复它呢?网上对此问题有很多的讨论.这里先总结一下网上流传的各种解决方案,看看这些办法是 ...

  5. Android双进程守护

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介: java.lang.Object ↳android.content.Context  ↳a ...

  6. 小程序后台持续定位功能

    wx.onLocationChange  //监听位置实时变化 wx.stopLocationUpdate //关闭监听位置变化,前后台都不接收 wx.startLocationUpdate //开启 ...

  7. 百度地图API后台持续定位、指南针改变位置问题

    最近的需要用到后台持续定位,项目中又是用的百度地图API,遇到点麻烦: 1.进入后台,手机静置,定位持续16分钟左右就停止了,但是还是无限后台效果:但如果一直运动,让定位持续更新,定位服务一直保持 其 ...

  8. 【Android】锁屏后应用保活、拉活、双进程守护

    最近在使用高德地图实时获取定位时遇到了个问题,锁屏后一段时间(5~10分钟左右)后程序会被系统杀死,为了保活,特研究了下进程保活机制. 0.基本操作和概念 针对root过的手机,可以通过下列命令查看内 ...

  9. Android 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context  ↳an ...

最新文章

  1. java实验报告 05 类与_java程序设计类与方法-java实验报告
  2. python super用法
  3. 奥数会不会彻底被信息奥赛取代?
  4. 26 Socket Addressing and Client Socket Programming
  5. android多线程实现计时器,方法一、使用Handler和Thread(线程)实现定时器
  6. mysql实际项目中使用多长时间_mysql常在项目中使用的语句总结
  7. 【论文解读】异构图表示学习综述 韩家炜组
  8. ngix请求转发配置
  9. 如何用计算机制作个人简历,制作个人简历的模板(电脑个人简历制作步骤)
  10. html audio解决浏览器无法播放问题
  11. LaTeX下载安装-1
  12. C++之 Eigen-3.4.0 全方位教程:Chapter02-矩阵篇
  13. 证件照缩小为20k大小
  14. ctf——逆向新手题目8 (logmein) WP
  15. 小蜜蜂吉他谱 高八度和低八度
  16. 可能是最漂亮的Spring事务管理详解
  17. paradigm画时序图 visual_Visual Paradigm使用技巧:从用户故事中生成序列图
  18. 线下 Meetup 预告|从原理到实战,详解 Database Plus 的互联网最佳实践
  19. 贝塞尔曲线与贝塞尔曲面
  20. python中true什么意思_python中的bool是什么意思

热门文章

  1. 2022谈谈海信电视/U盘装软件
  2. 威纶触摸屏485直接控制监控台达vfd-m变频器方式
  3. 【计算机网络】万字总结
  4. opengl高级光照之gamma校正
  5. [NOIP2004]合并果子
  6. [SCOI2005]扫雷MINE
  7. python 读取yml文件_python读取yaml配置文件
  8. Mysql发生Incorrect string value: ‘\xE5\x90\x8D\xE7\xA7\xB0‘异常
  9. 利用Sublime实现Evernote高亮代码的尝试
  10. mapper中查询语句 where 后条件全都可以为null的时候怎么办? 待解决