Android技术知识Android开发经验谈Android开发

Android 操作系统之 Activity 与 Service

2022-10-14  本文已影响0人  程序老秃子

Activity 与 Service 是否处于同一进程?

一般来说:同一个包内的 activity 和 service,如果 service 没有设定属性 android:process=":remote" 的话,service 会和 activity 跑在同一个进程中,由于一个进程只有一个 UI 线程,所以,service 和 acitivity 就是在同一个线程里面的

android:process=":remote" 值得注意他的用法!!!如果Activity 想访问 service 中的对象或方法,service 设定属性 android:process=":remote",那么就是跨进程访问,跨进程访问容易出现意想不到的问题,还是慎重给 service 设定属性 android:process=":remote"

Service 的两大功能是什么?怎样实现?

Service 主要有两个作用:

情况1:

当 Acitivity 和 Service 处于同一个 Application 和进程时,通过继承 Binder 类来实现

步骤如下:

情况2:

跨进程通讯,使用 AIDL

步骤如下:

当 acitivity 和 service 处于同一个 application 和进程时,通过继承 binder 类来实现

当一个 activity 绑定到一个 service 上时,它负责维护 service 实例的引用,允许你对正在运行的 service 进行一些方法调用;比如你后台有一个播放背景音乐的 service,这时就可以用这种方式来进行通信

代码如下:

public class localservice extends service {

private final ibinder binder = new localbinder();

public class localbinder extends binder {

localservice getservice() {

return localservice.this;

}

} public ibinder onbind(intent intent) {

return binder;

}

}
public class bindingactivity extends activity {
localservice localservice;

private serviceconnection mconnection = new serviceconnection() {

public void onserviceconnected(componentname classname,ibinder localbinder) { localservice = (localbinder) localbinder.getservice();

}

public void onservicedisconnected(componentname arg0) {

localservice = null;

}

};

protected void onstart() {

super.onstart();

intent intent = new intent(this, localservice.class);

bindservice(intent, mconnection, context.bind_auto_create);

}

protected void onstop() {

super.onstop();

unbindservice(mconnection);

}

public void printrandomnumber{

int num = localservice.getrandomnumber();

system.out.println(num);

}

}

代码解释:

使用使用 context.bindservice() 启动 service 会经历:

context.bindservice()->oncreate()->onbind()->service running

onunbind() -> ondestroy() ->service stop

该如何检验 activity 和 service 是否是在同一个进程中运行

一般情况下,activity 和 service 在同一个包名内,并且没有设定属性 android:process=":remote",两者在同一个进程中

因为一个进程只有一个 ui 线程,所以两者就在同一个线程里

如果设置 android:process=":remote",就属于跨进程访问,就属于不同的进程了

验证方法:

在 activiyt 和 service 的 oncreate 中打印进程的信息

如:

log.i("tag",thread.curentthread().getid());

尾述

有需要文中完整代码的小伙伴:可以点击此处获取底层源码 现在点击还可 免费获取一份 Android 高级开发系统化学习笔记

感谢阅读,希望这篇文章能够帮助到大家,觉得内容不错的话,可以点赞分享一下;谢谢大家的支持!

上一篇下一篇

猜你喜欢

热点阅读