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

标签: android
190人阅读 评论(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);
        }
    }
}

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

查看评论

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

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

探讨一种新型的双进程守护应用保活方法(双进程守护Demo)

  • 2016年12月06日 20:42
  • 6.28MB
  • 下载

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

一、进程保活 在 如何让我们的Android应用进程保活? 这篇文章里总结了一些进程保活方法,下文以双进程守护和进程提权来保活我们的服务进程。双进程守护: 主要设计AB两个不同服务进程,A进程的...
  • cxmscb
  • cxmscb
  • 2016-09-01 19:37:58
  • 11827

进程保活之双进程守护

双进程守护场景:home键,系统应用管理,直接杀死进程,进程仍然处于运行状态; 适用手机类型:50%的手机。 双进程守护原理: 进程A 进程B 删除A,同时创建B 删...
  • wxk105
  • wxk105
  • 2017-05-21 11:29:41
  • 356

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

在高版本Android系统中,应用能否常驻内存,我想一直以来都是某些APP头疼的事情。虽然APP常驻内存对于用户来说比较”恶心”,但是在一些特殊情况来说,APP的常驻内存却有尤其重要,很多时候用户也会...
  • AndrExpert
  • AndrExpert
  • 2016-12-06 11:53:18
  • 8564

Android双进程守护service保活

android应用进程保活可以从以下来年个方面考虑 1、尽量保证应用进程不被杀死。 2、进程被杀死后能够复活。 要保证进程不被杀死是不可能的,系统在资源紧缺的情况下回根据进程优先等级杀掉有限等...
  • ReturnNull0
  • ReturnNull0
  • 2016-12-19 23:44:17
  • 2291

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

             有图有真相,  亲测锤子T2、华为Mate8手机杀掉进程后能自启, 我设置的自启时间间隔为500ms(仅仅是为了测试)。                           ...
  • brycegao321
  • brycegao321
  • 2016-08-25 10:48:33
  • 11770

跑步的正确姿势

跑步和走路其实都是自然而又复杂的动作,合理的跑姿多感受,多练习就能达到效果。教科书式的跑姿往往出于竞赛的目的,技术动作的发挥有赖于运动员的身体素质,因此,普通爱好者找到轻松、协调的跑姿就行。 跑步的...
  • firstchange
  • firstchange
  • 2016-08-15 23:19:01
  • 288

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

应用场景:后台图片备份,息屏计步 应用在深圳大型互联公司,日活用户2000万 支持系统2.3到6.0 支持大部分设备,包括三星,华为,oppo,nexus,魅族等等 小米不行 (1)什么...
  • WHB20081815
  • WHB20081815
  • 2017-04-01 13:37:09
  • 2316

奋斗的正确姿势.mobi

  • 2017年10月30日 12:31
  • 4.3MB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 502
    排名: 10万+
    最新评论