安卓双进程保活的代码

简介: 安卓双进程保活的代码

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


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


 首先写一个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中负责联网。这样即使其中一个进程因错误崩溃,也可以被启动再次联网。

目录
相关文章
|
4月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
71 3
|
23天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
21 1
|
1月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
27 2
|
3月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
35 3
|
3月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
3月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
100 2
|
3月前
|
网络协议 安全 Unix
从孤岛到大陆:Python进程间通信,让你的代码世界不再有隔阂
【8月更文挑战第1天】在编程领域,Python进程曾像孤岛般各自运行于独立内存中。随项目复杂度增长,进程协同变得重要。Python提供了多种机制搭建这些孤岛间的桥梁。本文介绍四种常见进程间通信(IPC)方式:管道(Pipes)、队列(Queues)、共享内存(Shared Memory)及套接字(Sockets),并附示例代码展示如何实现信息自由流通,使进程紧密相连,共建复杂程序世界。
29 2
|
4月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
【7月更文挑战第28天】在Android开发中,每位开发者都追求极致的用户体验。然而,“代码执行慢”的问题时常困扰着开发者。通过案例分析,我们可探索从新手到高手的成长路径。
39 3
|
3月前
|
Java Android开发
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
Android项目架构设计问题之要提升代码的可读性和管理性如何解决
38 0

热门文章

最新文章

相关实验场景

更多