安卓多线程间通信和多进程之间通信有什么不同?分别怎么实现?
2016-11-22 10:13
393 查看
当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。 同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用, 也能保证用户正在访问的当前进程有足够的资源去及时地响应用户的事件。线程是进程的有机组成部分,是CPU调度的基础。一般情况下,都有主线程和其他线程之分,只有主线程才可以刷新UI。应用程序启动后,将创建ActivityThread 主线程。
不同包名的组件可以一定的方式运行在同一个进程中。
一个Activity启动后,至少会有3个线程。一个主线程和2个binder线程。
1.安卓线程间通信的方式有以下几种
1)共享变量(内存)
2)管道
3)handle机制
runOnUiThread(Runnable)
view.post(Runnable)
android 进程内的消息驱动机制---Handler,MessageQueue,Runnable,Looper
Looper和Message的处理机制:首先在主线程中创建了一个handler对象,目的是为了处理从子线程发送过来的消息,然后当子线程有发送消息的需求时会使用Message对象,消息首先会被存储在Message queue消息队列中,主线程还有一个Looper消息轮询器,会循环遍历消息队列中的消息,当发现消息的时候会发送消息给handler处理(更新ui等操作),handler调用handleMessage处理完后将Message置为null以便回收.
2进程间的通信
进程间的通信:
bind机制(IPC->AIDL)
linux级共享内存
boradcast
Activity之间可以通过intent来传递数据
3.安卓结束进程几种方式
1)使用ActivityManager中的restartPackage(String packname)方法,这里清单文件里面要配置权限
2)android.os.process.killProcess(int pid)只能终止本程序的进程
3)System.exit()
4)在android2.2版本之后则不能再使用restartPackage()方法,而应该使用killBackgroundProcesses()方法,同时应该配置权限
5)利用反射调用forceStopPackage来结束
配置文件中需要添加定义:
android:sharedUserId="android.uid.system"
另外需要再在配置文件添加权限:
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"></uses-permission>
6)使用Linux指令kill -9
7)退出到主屏幕
不同包名的组件可以一定的方式运行在同一个进程中。
一个Activity启动后,至少会有3个线程。一个主线程和2个binder线程。
1.安卓线程间通信的方式有以下几种
1)共享变量(内存)
2)管道
3)handle机制
runOnUiThread(Runnable)
view.post(Runnable)
android 进程内的消息驱动机制---Handler,MessageQueue,Runnable,Looper
Looper和Message的处理机制:首先在主线程中创建了一个handler对象,目的是为了处理从子线程发送过来的消息,然后当子线程有发送消息的需求时会使用Message对象,消息首先会被存储在Message queue消息队列中,主线程还有一个Looper消息轮询器,会循环遍历消息队列中的消息,当发现消息的时候会发送消息给handler处理(更新ui等操作),handler调用handleMessage处理完后将Message置为null以便回收.
2进程间的通信
进程间的通信:
bind机制(IPC->AIDL)
linux级共享内存
boradcast
Activity之间可以通过intent来传递数据
3.安卓结束进程几种方式
1)使用ActivityManager中的restartPackage(String packname)方法,这里清单文件里面要配置权限
2)android.os.process.killProcess(int pid)只能终止本程序的进程
3)System.exit()
4)在android2.2版本之后则不能再使用restartPackage()方法,而应该使用killBackgroundProcesses()方法,同时应该配置权限
5)利用反射调用forceStopPackage来结束
Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class);
forceStopPackage.setAccessible(true);
forceStopPackage.invoke(am, yourpkgname);
配置文件中需要添加定义:
android:sharedUserId="android.uid.system"
另外需要再在配置文件添加权限:
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"></uses-permission>
6)使用Linux指令kill -9
7)退出到主屏幕
public boolean onKeyDown(int keyCode, KeyEvent event) { // event.getRepeatCount():按下返回键,同时没有重复 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Intent home = new Intent(Intent.ACTION_MAIN); home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); home.addCategory(Intent.CATEGORY_HOME) 9a61 ; startActivity(home); } return super.onKeyDown(keyCode, event); }
相关文章推荐
- 多线程间通信和多进程之间通信有什么不同,分别怎么实现?
- Webservice 是通过什么协议实现的进程之间通信是怎么搞的
- iOS平台下实现不同APP之间的通信
- 三层交换实现不同VLAN之间的通信 推荐
- C++,java,Python的内部实现sort怎么实现的,有什么不同?
- 思科模拟器配置DHCP,并实现不同Vlan之间的通信
- 用广播(Broadcast)实现不同app之间的通信
- 利用LocalConnection实现多个应用之间的通讯 (不同MXML之间的通信)
- 独臂路由实现不同vlan之间的通信
- java web后台开发跟手机APP后台开发有什么不同? 二者怎么通信?
- 思科模拟器DNCP,并实现不同Vlan之间的通信
- iOS平台下实现不同APP之间的通信
- iOS平台下实现不同APP之间的通信
- 三层交换实现不同VLAN之间的通信
- 当要实现不同窗体之间的通信时可用单例模式
- cisco2801和cisco2960交换机实现双adsl接入及划分vlan,vlan通过不同的adsl上网,策略路由实现vlan之间的通信
- 单臂路由实现不同VLAN之间的通信
- iOS平台下实现不同APP之间的通信
- java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]
- 三层交换实现不同VLAN之间的通信