关于android中进程,服务和线程的一些理解

在android中 什么是进程?什么是服务?什么是线程?

  对于以上三个问题,我相信大家都会遇到.那么首先我们探讨下这三个问题吧。

  进程:

    进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。而在你创建的android程序中默认情况下,程序的所有组件都会运行在一个进程中,除非做修改,比如在Manifest文件中加入process属性,其中包含我们定义的组件,包括activity,service,receiver和provider四大组件。application元素也支持 android:process 属性,设置这个属性可以让这个应用里面的所有组件都默认继承这个属性。

     android是如何创建和销毁这些进程?这将让我们想起进程的生命周期.当我们启动android程序时,系统就会为我们的应用程序创建进程;进程销毁可以是我们手动销毁进程,或系统自动销毁进程。对于系统自动销毁进程是有等级之分,当系统要创建一个进程时,发现系统的内存不足,系统就会销毁一些进程,释放出内存,方便我们新建进程使用。销毁的这些进程在系统中所有进程中等级低的。

在这个重要性层级里面有5个等级。下面的列表按照重要性排序展示了不同类型的进程(第一种进程是最重要的,因此将会在最后被kill):

一.Foreground 进程 一个正在和用户进行交互的进程。 如果一个进程处于下面的状态之一,那么我们可以把这个进程称为 foreground 进程;2.进程包含了一个与用户交互的 Activity  (这个 Activity的 onResume() 方法被调用)。3.进程包含了一个绑定了与用户交互的activity的 Service 。3.进程包含了一个运行在”in the foreground”状态的 Service —这个 service 调用了 startForeground()方法。4.进程包含了一个正在运行的它的生命周期回调函数 (onCreate(), onStart(), oronDestroy())的 Service 。5进程包含了一个正在运行 onReceive() 方法的 BroadcastReceiver 。一般说来,任何时候,系统中只存在少数的 foreground 进程。 只有在系统内存特别紧张以至于都无法继续运行下去的时候,系统才会通过kill这些进程来缓解内存压力。在这样的时候系统必须kill一些 (Generally, at that point, the device has reached a memory paging state,这句如何翻译较好呢)foreground 进程来保证 用户的交互有响应。
二.Visible 进程 一个进程没有任何 foreground 组件, 但是它还能影响屏幕上的显示。 如果一个进程处于下面的状态之一,那么我们可以把这个进程称为 visible 进程:进程包含了一个没有在foreground 状态的 Activity ,但是它仍然被用户可见 (它的 onPause() 方法已经被调用)。这种情况是有可能出现的,比如,一个 foreground activity 启动了一个 dialog,这样就会让之前的 activity 在dialog的后面部分可见。
进程包含了一个绑定在一个visible(或者foreground)activity的 Service。一个 visible 进程在系统中是相当重要的,只有在为了让所有的foreground 进程正常运行时才会考虑去kill visible 进程。
三.Service 进程 一个包含着已经以 startService() 方法启动的 Service 的 进程,同时还没有进入上面两种更高级别的种类。尽管 service 进程没有与任何用户所看到的直接关联,但是它们经常被用来做用户在意的事情(比如在后台播放音乐或者下载网络数据),所以系统也只会在为了保证所有的 foreground and visible 进程正常运行时kill掉 service 进程。
四.Background 进程 一个包含了已不可见的activity的 进程 (这个 activity 的 onStop() 已 经被调用)。这样的进程不会直接影响用户的体验,系统也可以为了foreground 、visible 或者 service 进程随时kill掉它们。一般说来,系统中有许多的 background 进程在运行,所以将它们保持在一个LRU (least recently used)列表中可以确保用户最近看到的activity 所属的进程将会在最后被kill。如果一个 activity 正确的实现了它的生命周期回调函数,保存了自己的当前状态,那么kill这个activity所在的进程是不会对用户在视觉上的体验有影响的,因为当用户 回退到这个 activity时,它的所有的可视状态将会被恢复。查看 Activities 可以获取更多如果保存和恢复状态的文档。
五.Empty 进程 一个不包含任何活动的应用组件的进程。 这种进程存在的唯一理由就是缓存。为了提高一个组件的启动的时间需要让组件在这种进程里运行。为了平衡进程缓存和相关内核缓存的系统资源,系统需要kill这些进程。

以上五个进程的等级由高到低,最高为Foreground进程,最低为Empty进程。

Android是根据进程中组件的重要性尽可能高的来评级的。比如,如果一个进程包含来一个 service 和一个可见 activity,那么这个进程将会被评为 visible 进程,而不是 service 进程。

服务:

这是说的服务是指Service,这是android的一个组件,也就是四大组件这一。要弄懂服务也就是要弄明白Service如何使用

服务一般分为两种:

1:本地服务 Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

Service和Activity一样,也有它的生命周期,

context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() ->onDestroy()

具体如何使用:可参考http://blog.csdn.net/ithomer/article/details/7364024


线程:

当一个andorid应用启动时,进程中会包含一个主线程,也就是UI线程。UI线程主要负责图形绘制,事件调度等。android的UI线程不是线程安全的,所以你不能在一个worker线程操作你的UI—你必须在UI线程上对你的UI进行操作。worker线程是对单一线程的描述,保证应用界面的及时响应同时UI线程不被阻塞变得很重要。也就是除UI线程外的工作线程。我们虽不能在worker线程中对UI进行操作,但我们可以使用Handler来处理。Handler主要接受子线程发送的数据, 并用此数据配合主线程更新UI.具体操作如示例所示:

handler的主要方法

post(Runnable) postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

处理UI

Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
String s = String.valueOf(msg.what);
TextView tv = (TextView)findViewById(R.id.textView);
tv.setText(tv.getText() + ” ” + s);
}
};

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;

第一种:

  1. MyThread mt1 = new MyThread("线程1");  
  2. MyThread mt2 = new MyThread("线程2");  
  3. mt1.start();  
  4. mt2.start();  

第二种: 
  1. MyRunnable mt1 = new MyRunnable("线程a");  
  2. MyRunnable mt2 = new MyRunnable("线程b");  
  3. new Thread(mt1).start();  
  4. new Thread(mt2).start();  

第二种方法的优点是可以实现资源共享的特点。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值