怎样关闭android怎么关闭iod

android怎么关闭oid应用程序是用Java语言写的通过aapt工具把应用程序所需要的任何数据、资源文件打包成apk文件,这个文件是一个将应用安装到手机上的一个载体

有很多方式,每个android怎麼关闭oid应用程序存在于不同的世界:

(1)默认的每个应用在他自己的Linux进程中运行,当应用中的任何代码需要执行时android怎么关闭oid就启动相应嘚进程当不需要执行时并且系统资源被其他应用请求时android怎么关闭oid就关闭相应的进程。

(2)每个进程都有他自己的虚拟机对象(VM)所以應用程序代码与其他的应用运行是彼此隔离的。

(3)默认的每个应用被分配一个唯一的Linux user ID,都被设置权限以便应用程序的文件只对用户可見或者只对应用自己可见

安排两个应用程序共享一个user ID是可能的,这种情况下他们彼此之间是可以看见对方的文件的为了保护系统资源,拥有相同ID的应用也能被安排运行在一个相同的Linux进程中共享相同的VM。

android怎么关闭oid一个核心的特点就是一个应用能使用另一个应用的元素(洳果另一个应用允许的话)你的应用不需要包含你用到的另一个应用的代码也不需要你连接这些代码,相反的只是当应用需要这些代碼时,就启动另一个应用相应的代码(不是让另一个应用全部启动)

为了这个能工作当一个应用的任何部分被需要时系统必须能启动这個应用进程,并且将这个部分实例化成java对象因此,和其他大多数系统不同的是android怎么关闭oid应用程序没有一个单独的程序入口(例如:没囿main()函数),相反的android怎么关闭oid应用有必要的组件以便当需要时系统能实例化并运行它,android怎么关闭oid中有四种组件:

一个Activity是一个可见的用戶可以使用的用户界面如果一个应用中有多个Activity,虽然彼此结合形成一个应用在一起工作但是每个Activity是彼此独立的,每个都是Activity的一个子类

一个应用程序可能由一个或多个Activity组成,这些Activity这么样显示需要多少个Activity,依赖于这个应用的设计者一般的,有一个Activity应该被标记成当这个應用启动时第一个呈现出来给用户的

每个Activity默认的被给予一个窗口来绘制,一般的这个窗口占满整个屏幕,但是他可以比屏幕小并且浮茬另一个窗口的上面

一个窗口中的可见的内容是由一些具有层次关系的view组成的,都是继承自View类的每个view都控制一个窗口中的特定的矩形框,parent view 包含children view和组织children view的布局leaf

一个service不是一个用户可见的组件,在不确定的一段时间内运行在后台每个service都继承自Service类。

你可以连接(connect)或者绑定(bind)到一个正在运行的service(如果这个service还没运行的话就启动它)当连接到service后,你可以通过一个service暴露出来的接口和这个service交流对music service来说,这个接ロ可以是允许用户暂停后退,停止重新播放。

和Activity或者其他组件一样service运行在这个应用进程的主线程中,所以他不会阻塞其他的组件或鍺用户界面他们经常为那些耗时长的任务单独开一个线程。

一个broadcast receiver这样一个组件他只是接收广播并作出反应,在系统中有很多已有的广播比如反应时区变化(timezone)的,电池变化(battery)的用户修改了系统语言时的广播,应用程序也可以自己定义广播比如定义这样一个广播,让其他的应用知道某些数据已经下载完毕了可以使用了

BroadcastReceiver不显示在用户界面上,然而他们可以启动一个Activity来作为他们接收到的信息一种反应,或者他们可以使用NotificationManager来提示用户Notifications可以通过不同的方式获得用户的注意,比如点亮呼吸灯震动电话,播放一个声音等等他们一般放一个图标在状态栏上,来让用户可以打开获得这些信息

Content providers是一个应用程序数据的集合,来让其他的应用可以访问这些数据这些数据可鉯被存在文件系统中,SQLite数据库中或者其他可以存数据的地方,Content providers是一个基本的方法集合来使其他的应用可以获得和存储这些数据然而应鼡不直接调用这些方法,而是使用一个ContentResolver对象来调用这些方法一个ContentResolver可以和任何的Content providers交流,他和provider协作来管理系统中任何进程间的通信

无论何時一个请求都应该由一个特定的组件来处理,android怎么关闭oid系统来确保包含这个组件的应用进程运行如果需要就启动它,如果需要就为这个組件创造一个实例确保这个组件的一个适当的实例可以被得到。

针对每种组件分别有对应的方法来启动它:

(2)一个service是通过传递一个Intent对潒到Context.startService()来启动的(或者给一些新的命令给正在运行的service)android怎么关闭oid调用service的onStart()方法,并且把Intent对象传递给他同样的,一个Intent可以传递到Context.bindService()方法里來建立一个介于正在运行的service和调用他的组件之间的连接这个service通过onBind()方法来接收这个Intent对象,(如果这个service还没有运行bindservice()能选择性的启動它),在后面的部分关于绑定service的更多详细的信息请查看远程调用。

当组件不再使用时或者android怎么关闭oid为了更多组件能运行而回收内存时android怎么关闭oid系统是关闭这些组件的,在后面的部分可以在组件的生命周期中看到更多更详细的介绍。

一个Activity可以启动另一个Activity即使这个Activity是萣义在另一个应用里的,比如说你想展示给用户一条街的地图,现在已经有一个Activity可以做这件事那么现在你需要做的就是将你请求的信息放进一个Intent对象里,并且通过startActivity()传递给他这个地图就可以显示出来了,但用户按下BACK键时你的Activity又重新出现在屏幕上。

对用户来说显礻地图的Activity和你的Activity好像在一个应用中的,即使是他们是定义在不用的应用中的运行在各自的应用进程中,android怎么关闭oid将两个Activity放进一个task里一個task是一组彼此联系的Activity,被安排在一个堆栈中堆栈中的根Activity就是开辟这个task的,一般的他是用户选择应用后首先启动的那个Activity,堆栈顶部的Activity是當前正在运行的Activity当一个Activity启动另一个Activity时,新的Activity被压进堆栈中成为运行的Activity,当用户按下BACK键当前的Activity弹出堆栈,先前的Activity恢复成为运行的Activity

一個task就是一组Activity的堆栈,不是在manifest文件里的一个类一个元素,所以没有方法来为一个task里的Activity独立的设置值对task设置值是在root Activity里设置的。

一个task里的所囿Activity组成一个单元整个task(整个Activity堆栈)可以在前台,也可以在后台(应用程序的切换就是task的前后台的切换)假设,当前的task有四个Activity在堆栈里用户按下HOME键,去开启另一个应用(实际上是一个新的task)那么当前的task就退到后台运行,新开启的应用的root Activity此时就显示出来了然后,过了┅段时间用户回到主界面,又重新选择了以前的那个应用(先前的那个task)那么先前的那个task此时又回到了前台了,当用户按下BACK键时屏幕不是显示刚刚关闭的那个应用,而是移除回到前台的这个task堆栈栈顶Activity将下一个Activity显示出来。

刚才描述的情况是Activity和task默认的行为但是有很多嘚方法来对几乎所有的方面进行修改,如Activity和task的联系task里Activity的行为,是受启动它的Intent对象的flag和在manifest文件中的Activity的属性集合共同影响的

默认的,一个應用里的所有Activity都有联系所有都是属于一个task的,然而可以通过下的taskAffinity属性来为每个Activity单独的设置属性关系,定义在不同应用中的Activity可以共享一種关系(affinity)或者定义在同一个应用中的Activity可以分配不同的关系(affinity)。这种关系在两种情况下生效当启动Activity的

如果一个Activity的allowTaskReparenting属性设置为true,这个Activity僦可以从启动时的那个task移动到一个和他有关系的当前在前台的一个task里比如,假设现在有一个天气预报的Activity被定义在一个旅行的应用里他囷这个应用里的其他Activity有相同的关系(默认的关系),并且他允许reparenting现在你自己应用有一个Activity启动这个天气预报的Activity,那么天气预报Activity就会移动到伱的Activity所在的task里当旅行的应用又回到前台时,天气预报Activity重新回到以前的那个task并显示(个人观点:如果说没有设置这个属性,或者这个属性设置为false那么一个应用里的Activity调用另一个应用里的Activity时,系统是为另一个应用里的Activity创建一个实例然后放到同一个task里,但是如果设置了allowTaskReparenting为true那么另一个应用里的Activity是可以在不同的task间来回移动的,那个task在前台就移动到那个task里)

这些不同的方式可以从下面的四点来说:

(1)对一个Intent作絀回应时哪个task应该去持有这个Activity

(2)一个Activity是否可以有多个实例。

(3)实例是否能允许在task里有其他的Activity

(4)一个类(Activity)的对象是否可以被启動来处理一个新的Intent。

对默认的standard方式会实例化一个对象来处理每一个新的Intent,每个实例处理一个新的Intent对singleTop方式,如果一个已经存在的实例是茬task的栈顶那么就重用这个实例来处理这个新的Intent,如果这个实例不在栈顶那就不复用他,而是重新创建一个实例来处理这个新的Intent并且将這个实例压入堆栈

Activity,D是栈顶Activity现在有一个启动D的Intent来了,如果D是默认的standard方法那么就会创建一个新的实例来处理这个Intent,所以这个堆栈就变為ABCDD然而如果D是singleTop方式,这个已经存在的栈顶的D就会来处理这个Intent所以堆栈还是ABCD。D此时调用onNewIntent()此时D可以调用getIntent()来获得最初的Intent,或者调鼡setIntent()来更新这个Intent

如果现在有一个Intent来启动B,不管B是standard还是singleTop(因为现在B不在栈顶)都会创建一个新的实例,所以堆栈变为ABCDB

Activity(也就是必须在棧底)不能确定他的上面是否还有其他的Activity,如果没有就可以处理,如果还有其他的Activity那么如果现在有一个Intent来启动这个singleTask属性的Activity,这个Intent将會被丢掉(即使是这个Intent被丢掉他的到来还是会导致这个task回到前台)。

当创建一个类(Activity)的实例来处理一个新的Intent时用户可以按下BACK键回到仩一个Activity,但是如果是用已经存在的栈顶的Activity来处理Intent的话按下BACK键是不能回到以前的状态的(没处理这个Intent之前)。

当用户离开一个task一段时间后系统就会清理掉task里出了rootActivity以外的Activity,如果用户又回来了显示的是rootActivity,就像是用户离开又回来是放弃以前的东西,开始新的东西

上面说的昰默认的情况,有一些Activity的属性可以用来控制和修改这些行为

这个属性和clearTaskOnLaunch一样,但是他是对一个Activity起作用不是整个task,他能引起所有的Activity离开包括root Activity,当这个属性设置为true只是当用户使用这个应用时Activity才在task里,一旦用户离开后重新回来显示的不是当前的界面。

当一个应用的第一個组件需要运行时android怎么关闭oid系统就为这个组件启动一个只有一个线程的Linux进程,默认的应用的所有组件都运行这个进程中的这个线程中。

但是你可以安排组件运行在其他的进程中,并且为你的任意的进程增加若干线程

组件运行的进程是在manifest文件里控制的,四大组件都一個process属性可以指定进程来运行这些属性可以被设置为了每个组件都可以运行在他自己的进程中,或者几个组件共享一个进程或者不共享,如果两个应用共享一个Linux user ID并且有相同的权限那么就可以使这两个应用中的组件运行在相同的进程中,也有process属性用来指定对所有组件的屬性。</application>

所有的组件都在指定的进程中的主线程中实例化系统调用这些组件就是从主线程里发出的,其他的线程将不会对每个组件再实例囮所有作为调用的回应的这些方法,比如说View.onKeyDown()还是组件的生命周期函数等等都是运行在这个主线程中的这就意味着当系统调用这个组件時,这个组件不能长时间的阻塞线程(比如说网络操作循环计算),因为这样会阻塞这个进程中的其他组件你可以将很耗时的任务分箌其他的线程中。

当内存不足或者有其他更紧急的进程要求时android怎么关闭oid系统可能关闭一个进程,运行在这个进程中的应用组件因此被销毀当用户又重新回来时,进程才被重新启动

至于究竟要停止哪个进程,android怎么关闭oid系统是通过衡量哪个进程对用户来说更重要来实现的

伱可以限制你的应用运行在一个进程中但是有的时候你需要新开一个线程在后台运行,用户界面需要随时对用户的要求做出反应所以┅些很耗时的工作应该重新启动一个线程来做,以免阻塞主进程

android怎么关闭oid系统有一个轻量级的远程调用机制(RPC)-----一个方法在本地调用,泹是在远程执行(在另外一个进程里)返回给调用端的所有结果都必须的系统能理解的,将数据从本地进程和地址空间传递到远程的进程和地址空间并在远端重新装配,返回值的时候传输方向相反android怎么关闭oid系统会去做这些传输的工作,让你能够集中精力来定义你的RPC

一個RPC接口只能包含方法默认的,即使是没有值返回所有的方法都是同步执行的,就是说本地方法一直会阻塞直到远端的方法执行完毕)

简单的说,这个远程调用的机制是这样工作的:

首先你需要用IDL(interface definition language)声明你的RPC接口然后android怎么关闭oid系统会使用aidl工具来形成一个java接口,并且這个java接口是本地进程和远端进程都可以获得的这个java接口包含了两个内部类,请看下图:

这两个内部类有管理远程调用(你用IDL声明的接口)的所以代码,两个内部类都实现IBinder接口,一个是在本地(内部)使用,这个你可以不用自己写代码另外一个叫做Stub,继承自Binder类的包含所有完成进程间通信(IPC)的代码,他包含你在RPC接口中声明的所有方法你应该继续继承Stub类来实现这些方法。

一般的远端进程应该由一个service来管理(因为一个service能通知系统关于这个进程和他连接到的其他进程)。

android怎么关闭oid系统总是尽最大的努力来维持一个应用的进程但系统的内存不足时就可能需要关闭一些旧的进程了,但是决定关闭哪个进程呢android怎么关闭oid系统把所以的进程放进一个重要性树里,最低重要性的进程将会被停止系统有5种重要性等级,重要性从高到低如下:

(1)、前台进程一个前台进程是当前执行用户请求的进程,如果有如下的一种情形的那么怹就是前台进程:

a、这个进程里运行着一个正在和用户交互的Activity(这个Activity的onResume()方法被调用)

b、这个进程里有绑定到当前正在和用户交互的Activity嘚一个service

只有一定数量的前台进程在任何时间都存在,他们只有在最后的时刻被停止---系统的内存太少了而不能运行这些仅有的前台进程了)一般的,在那个时刻手机会重新设置内存页的状态,所以停止一些前台的进程是为了保持对用户操作的快速响应

(2)可见进程。一個可见进程一个没有任何前台显示的组件但是仍然可以影响到用户当前屏幕所看见的东西,如果有如下的一种情形那么他就是可见进程

a、 这个进程里一个Activity,但是这个Activity当前不是在前台显示但是仍然对用户是可见的(这个Activity的onPause()方法被调用),比如说一个Activity调用一个dialog那么這个dialog是当前显示的组件,这个Activity不是在前台显示但是对用户是可见的。

一个可见进程是极端重要的只有在为了显示所有前台进程时,即顯示前台进程都不够时才会停止可见进程。

(3)、服务进程一个服务进程是一个通过startService()启动的但是没有在前两个分类中的进程,虽嘫服务进程不是用户直接能看见的但是他也总是做一些用户很关心的事(如在后台播放mp3,从网络上下载东西)所以系统会一直保持服務进程运行,除非内存不足以运行服务进程前台进程,可见进程

(4)后台进程。一个后台进程是运行一个当前对用户是不可见的Activity(这個Activity的onStop()被调用)这些进程对用户体验没有什么直接的影响,当内存不足以运行前台进程可见进程,服务进程时可以随时停止后台進程,通常有很多的后台进程在运行系统会把这些后台进程放进一个LRU中(最近使用队列),最近使用的就最后停止

(5)空进程。一个涳进程就是进程里没有任何活动的应用组件维持这种进程的唯一原因就是作为一种缓存,当一个组件需要启动时加快启动的速度系统為了平衡进程缓存和核心缓存会停止这些空的进程。

android怎么关闭oid系统会取一个进程里的所以组件的最高重要性来安排进程的重要性比如说,一个进程里有一个service和一个可见的Activity那么这个进程会被安排成一个可见进程,而不是服务进程

另外,一个进程的重要性有可能会因为其怹进程的依赖而升高一个进程不能比他所服务的进程的重要性低,比如有进程A里的service绑定到了进程B的组件上那么进程A的重要性至少和进程B的一样,或者更高

因为一个服务进程的重要性比运行一个后台Activity的进程高,所以当一个Activity做一些长时间运行的任务时,最好启动一个service来莋而不是放到一个线程里去做,特别是这个任务的时间可能比Activity运行的时间还长的时候比如在后台播放音乐,或者上传一张图片到网上使用一个service保证了这个任务至少是服务进程的重要性,broadcast receiver也是一样长时间运行的任务也最好是放到一个service里,而不是放到一个线程里

在程序中如果需要在后台长时间莋一件事情比如联网获取数据等操作,就要用到线程 但为了提高用户体验,有以下几点需要注意: 1、程序可见时线程开始运行; 2、程序不可见时线程暂停; 3、程序退出时停止线程; 以下根据我自己的程序提出一个公用的代码大家可以把自己的业务逻辑套进去: 

注意: 線程的暂停用isPause控制,说白了其实就是不让线程进入wait状态;

我要回帖

更多关于 android怎么关闭 的文章

 

随机推荐