安卓双进程保活的代码

简介: 首先要声明,双进程保活,不是为了解决被杀之后复活的问题。因为在新版本的安卓上,这个办法已经不灵了(也许有人有更好的办法?)。这里介绍这个双进程保活,是为在电视盒子上的应用。如果进程死了,有的系统会自动启动,有的就不会。而有的应用在电视盒子上必须常在线。

首先要声明,双进程保活,不是为了解决被杀之后复活的问题。因为在新版本的安卓上,这个办法已经不灵了(也许有人有更好的办法?)。这里介绍这个双进程保活,是为在电视盒子上的应用。如果进程死了,有的系统会自动启动,有的就不会。而有的应用在电视盒子上必须常在线。


 本文实现方法,与其他介绍的原理一样,代码更加精练。为什么呢?因为使用了继承。


 首先写一个AIDL:

package com.csdn;
interface IKeepAliveServiceConnection
{
    String getProcessName();
}

然后写一个父类:

package com.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;
import com.newayte.nvideo.IKeepAliveServiceConnection;
public abstract class KeepAliveService extends Service
{
    private static final String TAG = KeepAliveService.class.getCanonicalName();
    private static final String KEEP_ALIVE = "keep-alive";
    private KeepAliveBinder mKeepAliveBinder;
    private KeepAliveServiceConnection mKeepAliveConnection;
    @Override
    public void onCreate()
    {
        super.onCreate();
        if (mKeepAliveBinder == null)
        {
            mKeepAliveBinder = new KeepAliveBinder();
            mKeepAliveConnection = new KeepAliveServiceConnection();
        }
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        bindService(getConnectionIntent(), mKeepAliveConnection, Context.BIND_IMPORTANT);
        Log.d(TAG, "onStartCommand()");
        /*PendingIntent contentIntent = PendingIntent.getService(this, 0, intent, 0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setTicker("CSDN")
                .setContentIntent(contentIntent)
                .setContentTitle("TITLE")
                .setAutoCancel(true)
                .setContentText("CONTENT")
                .setWhen( System.currentTimeMillis());
        //把service设置为前台运行
        startForeground(startId, builder.build());*/
        return START_STICKY;
    }
    @Override
    public IBinder onBind(Intent intent)
    {
        //子类如果跟其他进程绑定时,从父类得到的binder不为空,说明是从保活服务启动的。
        Log.d(TAG, KEEP_ALIVE+"="+intent.getBooleanExtra(KEEP_ALIVE, false)+", "+intent);
        if (intent.getBooleanExtra(KEEP_ALIVE, false))
        {
            return mKeepAliveBinder;
        }
        return null;
    }
    private Intent getConnectionIntent()
    {
        Intent intent = new Intent(KeepAliveService.this, getPeerService());
        intent.putExtra(KEEP_ALIVE, true);
        return intent;
    }
    class KeepAliveBinder extends IKeepAliveServiceConnection.Stub
    {
        @Override
        public String getProcessName() throws RemoteException
        {
            return getServiceName();
        }
    }
    class KeepAliveServiceConnection implements ServiceConnection
    {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service)
        {
            Log.d(TAG, getPeerService().getCanonicalName()+"建立连接成功!");
        }
        @Override
        public void onServiceDisconnected(ComponentName name)
        {
            Log.d(TAG, getPeerService().getCanonicalName()+"服务进程已死。重新启动并建立链接。");
            //启动被干掉的
            KeepAliveService.this.startService(getConnectionIntent());
            KeepAliveService.this.bindService(getConnectionIntent(), mKeepAliveConnection, Context.BIND_IMPORTANT);
        }
    }
    /**
     * 这两个并不是必要的。
     * 考虑到子类,还是要有点代码的。
     *
     * @return
     */
    protected abstract String   getServiceName();
    protected abstract Class<?> getPeerService();
}

子类服务助手(怎么样?使用了继承,极为简单吧):

package com.keepalive;
public class AssistantServiceTv extends KeepAliveService
{
    @Override
    protected String   getServiceName()
    {
        return AssistantServiceTv.class.getCanonicalName();
    }
    @Override
    protected Class<?> getPeerService()
    {
        return NetworkServiceTv.class;
    }
}

主服务(注意onBind()的代码):

package com.keepalive;
public class NetworkServiceTv extends KeepAliveService
{
    @Override
    public IBinder onBind(Intent intent)
    {
        Log.d(TAG, "service onBind="+intent);
        IBinder binder = super.onBind(intent);
        if (null != binder)
        {
            return binder;
        }
        return mBinder;
    }
    @Override
    protected String   getServiceName()
    {
        return NetworkServiceTv.class.getCanonicalName();
    }
    @Override
    protected Class<?> getPeerService()
    {
        return AssistantServiceTv.class;
    }
}

在NetworkServiceTv中负责联网。这样即使其中一个进程因错误崩溃,也可以被启动再次联网。

目录
相关文章
|
27天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
22 1
|
1月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
28 2
|
2月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
312 4
|
3月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
36 3
|
3月前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
62 1
|
3月前
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
268 8
|
3月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
100 2
|
4月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
【7月更文挑战第28天】在Android开发中,每位开发者都追求极致的用户体验。然而,“代码执行慢”的问题时常困扰着开发者。通过案例分析,我们可探索从新手到高手的成长路径。
40 3
|
3月前
|
Java Android开发
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
40 0

相关实验场景

更多