版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中实现双进程守护
这期内容当中在下将会给大家带来有关怎么在Android中实现双进程守护,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。双进程守护双进程守护的思想就是,两个进程共同运行,如果有其中一个进程被杀,那么另一个进程就会将被杀的进程重新拉起,相互保护,在一定的意义上,维持进程的不断运行。双进程守护的两个进程,一个进程用于我们所需的后台操作,且叫它本地进程,另一个进程只负责监听着本地进程的状态,在本地进程被杀的时候拉起,于此同时本地进程也在监听着这个进程,准备在它被杀时拉起,我们将这个进程称为远端进程。由于在Android中,两个进程之间无法直接交互,所以我们这里还要用到AIDL(AndroidinterfacedefinitionLanguage),进行两个进程间的交互。代码实现先来看一下demo代码结构,结构很简单,我这里创建了一个Activity作为界面,以及两个Service,一个是后台操作的本地Service,另一个是守护进程的远端Service,还有一个AIDL文件用作进程间交互用。项目结构Activity的定义很简单,就几个按钮,控制Service的状态,我这边定义了三个按钮,一个是开启后台服务,另外两个分别是关闭本地Service和远端的Service。/**
*
@author
chaochaowu
*/
public
class
GuardActivity
extends
AppCompatActivity
{
@BindView(R.id.button)
Button
button;
@BindView(R.id.button2)
Button
button2;
@BindView(R.id.button3)
Button
button3;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
setContentView(R.layout.activity_guard);
ButterKnife.bind(this);
}
@OnClick({R.id.button,
R.id.button2,
R.id.button3})
public
void
onViewClicked(View
view)
{
switch
(view.getId())
{
case
R.id.button:
startService(new
Intent(this,
LocalService.class));
break;
case
R.id.button2:
stopService(new
Intent(this,
LocalService.class));
break;
case
R.id.button3:
stopService(new
Intent(this,
RemoteService.class));
break;
default:
break;
}
}
}可以看一下界面。主界面AIDL文件可以根据业务需要添加接口。/**
*
@author
chaochaowu
*/
interface
IMyAidlInterface
{
String
getServiceName();
}重点是在两个Service上。在定义Service时,需要在AndroidManifest中声明一下远端Service的process属性,保证本地Service和远端Service两者跑在不同的进程上,如果跑在同一个进程上,该进程被杀,那就什么都没了,就没有了双进程守护的说法了。<service
android:name=".guard.LocalService"
android:enabled="true"
android:exported="true"
/>
<service
android:name=".guard.RemoteService"
android:enabled="true"
android:exported="true"
android:process=":RemoteProcess"/>先来看LocalService的代码,重点关注onStartCommand方法和ServiceConnection中重写的方法。onStartCommand方法是在Service启动后被调用,在LocalService被启动后,我们将RemoteService进行了启动,并将LocalService和RemoteService两者绑定了起来(因为远端Service对于用户来说是不可见的,相对于我们实际工作的进程也是独立的,它的作用仅仅是守护线程,所以说RemoteService仅与LocalService有关系,应该只能由LocalService将它启动)。启动并绑定之后,我们需要重写ServiceConnection中的方法,监听两者之间的绑定关系,关键的是对两者绑定关系断开时的监听。当其中一个进程被杀掉时,两者的绑定关系就会被断开,触发方法onServiceDisconnected,所以,我们要在断开时,进行进程拉起的操作,重写onServiceDisconnected方法,在方法中将另外一个Service重新启动,并将两者重新绑定。/**
*
@author
chaochaowu
*/
public
class
LocalService
extends
Service
{
private
MyBinder
mBinder;
private
ServiceConnection
connection
=
new
ServiceConnection()
{
@Override
public
void
onServiceConnected(ComponentName
name,
IBinder
service)
{
IMyAidlInterface
iMyAidlInterface
=
IMyAidlInterface.Stub.asInterface(service);
try
{
Log.i("LocalService",
"connected
with
"
+
iMyAidlInterface.getServiceName());
}
catch
(RemoteException
e)
{
e.printStackTrace();
}
}
@Override
public
void
onServiceDisconnected(ComponentName
name)
{
Toast.makeText(LocalService.this,"链接断开,重新启动
RemoteService",Toast.LENGTH_LONG).show();
startService(new
Intent(LocalService.this,RemoteService.class));
bindService(new
Intent(LocalService.this,RemoteService.class),connection,
Context.BIND_IMPORTANT);
}
};
public
LocalService()
{
}
@Override
public
void
onCreate()
{
super.onCreate();
}
@Override
public
int
onStartCommand(Intent
intent,
int
flags,
int
startId)
{
Toast.makeText(this,"LocalService
启动",Toast.LENGTH_LONG).show();
startService(new
Intent(LocalService.this,RemoteService.class));
bindService(new
Intent(this,RemoteService.class),connection,
Context.BIND_IMPORTANT);
return
START_STICKY;
}
@Override
public
IBinder
onBind(Intent
intent)
{
mBinder
=
new
MyBinder();
return
mBinder;
}
private
class
MyBinder
extends
IMyAidlInterface.Stub{
@Override
public
String
getServiceName()
throws
RemoteException
{
return
LocalService.class.getName();
}
}
}在另外一个RemoteService中也一样,在与LocalService断开链接的时候,由于监听到绑定的断开,说明RemoteService还存活着,LocalService被杀进程,所以要将LocalService进行拉起,并重新绑定。方法写在onServiceDisconnected中。/**
*
@author
chaochaowu
*/
public
class
RemoteService
extends
Service
{
private
MyBinder
mBinder;
private
ServiceConnection
connection
=
new
ServiceConnection()
{
@Override
public
void
onServiceConnected(ComponentName
name,
IBinder
service)
{
IMyAidlInterface
iMyAidlInterface
=
IMyAidlInterface.Stub.asInterface(service);
try
{
Log.i("RemoteService",
"connected
with
"
+
iMyAidlInterface.getServiceName());
}
catch
(RemoteException
e)
{
e.printStackTrace();
}
}
@Override
public
void
onServiceDisconnected(ComponentName
name)
{
Toast.makeText(RemoteService.this,"链接断开,重新启动
LocalService",Toast.LENGTH_LONG).show();
startService(new
Intent(RemoteService.this,LocalService.class));
bindService(new
Intent(RemoteService.this,LocalService.class),connection,
Context.BIND_IMPORTANT);
}
};
public
RemoteService()
{
}
@Override
public
int
onStartCommand(Intent
intent,
int
flags,
int
startId)
{
Toast.makeText(this,"RemoteService
启动",Toast.LENGTH_LONG).show();
bindService(new
Intent(this,LocalService.class),connection,Context.BIND_IMPORTANT);
return
START_STICKY;
}
@Override
public
IBinder
onBind(Intent
intent)
{
mBinder
=
new
MyBinder();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急预案汛期学校安全工作应急预案范文
- 期中考试国旗下励志讲话
- 一年级下册语文第四单元基础测评卷(有答案含解析)(教师版)
- 职业健康检查机构备案管理办法
- 2024年无产权车库买卖协议范本(二篇)
- 2024年音响设备租赁协议模板(二篇)
- 2024年租房定金协议(三篇)
- 2024年大型货车租赁合同标准版(二篇)
- 2024年专利转让合同范文(2篇)
- 2024年花卉租赁合同电子版(三篇)
- UPS蓄电池安装施工方案
- 英语演讲与辩论-西北工业大学中国大学mooc课后章节答案期末考试题库2023年
- 安徽省合肥市瑶海区2022-2023学年八年级下学期期末数学试卷(解析版)
- 高中语文-品意象 究词情-《望海潮》《扬州慢》群文赏析教学设计学情分析教材分析课后反思
- 部编版语文一年级上册第四单元大单元作业设计
- 山东省青岛市城阳第一中学2022-2023学年高一数学文期末试题含解析
- 血管紧张素转换酶抑制剂治疗心力衰竭药理作用及应用
- 手机银行岗位职责
- 《数字通信基础》课程标准
- 中建一局集团战略发展分析报告
- 临床诊断技术-神经系统检查(兽医临床诊疗技术)
评论
0/150
提交评论