关闭

进程保活-双进程守护的正确姿势

标签: android
167人阅读 评论(0) 收藏 举报
分类:

做车机的开发免不了在后台开很多服务,做车机的APP跟做普通的手机APP区别在于做车机要用到很多的进程间的通信交互等,一个应用死了,可能导致整个机器都运转不正常了,不会进程间的通信怎么可以,撸起来!

双进程守护,肯定得用到多进程,一个应用可以有多个进程的,如何实现多进程呢,service或者activity等都有一个属性android:process,只要设置起名称就可指定该组件运行在该进程中。在这里我们就指定了RemoteService运行在包名.remote这个进程中。

   <service
            android:name=".LocalService"
            android:enabled="true"
            android:exported="true" />
        <service
            android:name=".RemoteService"
            android:enabled="true"
            android:exported="true"
            android:process=".remote"></service>

首先我们在MainActivity中启动两个Activity,

startService(new Intent(this, LocalService.class));
startService(new Intent(this, RemoteService.class));

为什么加双进程守护呢,A死掉B拉A起来,B死掉A拉B起来,那么A和B怎么知道对方有没有死呢?当然用AIDL,就是进程间的通信实现的一种方式。

首先在main下面写一个aidl文件
这里写图片描述

然后在build 下reBuild一下工程,就可生成aidl对应的java文件
这里写图片描述

下面开始正式的代码编写
两个Service的代码基本相同
首先在LocalService中绑定RemoteService

 class MyBinder extends MyAidlInterface.Stub {

        @Override
        public String getServiceName() throws RemoteException {
            return LocalService.class.getSimpleName();
        }
    }

当绑定关系断掉,也就是RemoteService死掉时,在LocalService中把它启动起来并且重新建立绑定关系:

class MyConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("LocalService", "onServiceConnected: " );
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("LocalService", "onServiceDisconnected: " );
            LocalService.this.startService(new Intent(LocalService.this, RemoteService.class));
            LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), conn, Context.BIND_IMPORTANT);
        }
    }

核心代码就是上面两段,在RemoteService中的操作基本与之相同。
整体代码如下:

LocalService的代码如下:
package keepalive.com.xn.keepalive;

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class LocalService extends Service {
    MyBinder binder;
    MyConn conn;

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        binder = new MyBinder();
        if (conn == null) {
        conn = new MyConn();
        }

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.bindService(new Intent(this, RemoteService.class), conn, Context.BIND_IMPORTANT);
        return super.onStartCommand(intent, flags, startId);
    }

    class MyBinder extends MyAidlInterface.Stub {

        @Override
        public String getServiceName() throws RemoteException {
            return LocalService.class.getSimpleName();
        }
    }

    /**
     * 连接时需要用到此类
     */
    class MyConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("LocalService", "onServiceConnected: " );
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("LocalService", "onServiceDisconnected: " );
            LocalService.this.startService(new Intent(LocalService.this, RemoteService.class));
            LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), conn, Context.BIND_IMPORTANT);
        }
    }
}
RemoteService的代码如下:
package keepalive.com.xn.keepalive;

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class RemoteService extends Service {
    MyBinder binder;
    MyConn conn;

    public RemoteService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        binder = new MyBinder();
        if (conn == null) {
            conn = new MyConn();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.bindService(new Intent(this, LocalService.class), conn, Context.BIND_IMPORTANT);
        return super.onStartCommand(intent, flags, startId);
    }

    class MyBinder extends MyAidlInterface.Stub {

        @Override
        public String getServiceName() throws RemoteException {
            return RemoteService.class.getSimpleName();
        }
    }

    /**
     * 连接时需要用到此类
     */
    class MyConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e(RemoteService.this.toString(), "onServiceConnected: ");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e(RemoteService.this.toString(), "onServiceDisconnected: ");
            RemoteService.this.startService(new Intent(RemoteService.this, LocalService.class));
            RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
        }
    }
}

思路和代码都是非常简单的,当然还有其他的保活方式,以后再说咯。

0
0
查看评论

进程保活之双进程守护

双进程守护场景:home键,系统应用管理,直接杀死进程,进程仍然处于运行状态; 适用手机类型:50%的手机。 双进程守护原理: 进程A 进程B 删除A,同时创建B 删除B,同时创建A 前提相关知识: 1、Service分类:一种localService 也就是普...
  • wxk105
  • wxk105
  • 2017-05-21 11:29
  • 322

安卓开发之使用双进程守护和进程提权来实现服务进程保活

一、进程保活 在 如何让我们的Android应用进程保活? 这篇文章里总结了一些进程保活方法,下文以双进程守护和进程提权来保活我们的服务进程。双进程守护: 主要设计AB两个不同服务进程,A进程的服务轮询检查B进程的服务是否存活,没存活的话将其拉起,同样B进程服务轮询检查A进程服务是否存活,没存...
  • cxmscb
  • cxmscb
  • 2016-09-01 19:37
  • 11327

Android 永生不死的进程,进程守护,进程常驻,进程保活

应用场景:后台图片备份,息屏计步 应用在深圳大型互联公司,日活用户2000万 支持系统2.3到6.0 支持大部分设备,包括三星,华为,oppo,nexus,魅族等等 小米不行 (1)什么时候系统会去杀死进程?  Android系统会在内存不足的时候去将进程杀死,俗称Lo...
  • WHB20081815
  • WHB20081815
  • 2017-04-01 13:37
  • 1826

探讨一种新型的双进程守护应用保活

在高版本Android系统中,应用能否常驻内存,我想一直以来都是某些APP头疼的事情。虽然APP常驻内存对于用户来说比较”恶心”,但是在一些特殊情况来说,APP的常驻内存却有尤其重要,很多时候用户也会要求APP能够保证长久运行。因此,这里只研究APP应用在一些特殊场合的保活方法,内容仅供参考。
  • AndrExpert
  • AndrExpert
  • 2016-12-06 11:53
  • 7303

安卓应用保活实践(双进程守护)

研究安卓应用保活黑科技已经有一段时间了,其实很多都是看看文章,博客,看完就忘了,今天休息,在家写写Demo,研究一下,跟大家分享。 学习资料:http://www.oschina.net/code/snippet_1021353_36835    &...
  • xiaoBaiFeiJi
  • xiaoBaiFeiJi
  • 2016-07-10 17:29
  • 2640

Android双进程守护service保活

android应用进程保活可以从以下来年个方面考虑 1、尽量保证应用进程不被杀死。 2、进程被杀死后能够复活。 要保证进程不被杀死是不可能的,系统在资源紧缺的情况下回根据进程优先等级杀掉有限等级比较低的进程,所以为了使自己的进程不易于被系统杀死,只能提高进程的优先级,这个进程重要性的层次结构...
  • ReturnNull0
  • ReturnNull0
  • 2016-12-19 23:44
  • 1964

Android 双进程守护(分分钟实现)

是这个情况,前几天在腾讯公开课看到的,确实不错,首先我先说下怎么实现的?**实现思路:**创建A,B两个服务,然后同时启动A、B服务,双进程守护,当然要另开一个进程,通过AIDL实现跨进程通信,在A、B服务中的onStartCommand方法中,互相绑定对方,然后我们想想,服务如果被强杀了怎么办,接...
  • LiuYangQiao
  • LiuYangQiao
  • 2016-10-09 17:27
  • 7539

Android 进程常驻、进程守护、进程保活技术的总结

转载自:http://blog.csdn.net/marswin89/article/details/50917098  这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取ro...
  • wangbaochu
  • wangbaochu
  • 2016-03-21 10:44
  • 17478

Android5.0以上app进程保活的正确姿势

有图有真相, 使用有情怀的锤子手机验证杀掉进程后能自启, 我设置的时间间隔为500ms(仅仅是为了测试)。                  ...
  • brycegao321
  • brycegao321
  • 2016-08-25 10:48
  • 10968

谈谈学习 --- 我认为的正确的学习姿势

复制粘贴党与伸手党永远都不会成为大牛。
  • qq_31655965
  • qq_31655965
  • 2017-04-25 16:57
  • 1478
    个人资料
    • 访问:11677次
    • 积分:473
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条