【移动应用开发技术】怎么在Android中实现双进程守护_第1页
【移动应用开发技术】怎么在Android中实现双进程守护_第2页
【移动应用开发技术】怎么在Android中实现双进程守护_第3页
【移动应用开发技术】怎么在Android中实现双进程守护_第4页
【移动应用开发技术】怎么在Android中实现双进程守护_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论