如何快速学会android四大的四大基础

这篇文章会从Service的一些小知识点延伸到android四大中几种常用进程间通信方法。

 Service是一种不提供用户交互页面但是可以在后台长时间运行的组件可以通过在android四大Manifest.xml设置Service的android四大:process=":remote"属性,让Service运行另一个进程中也就是说,虽然你是在当前应用启动的这个Service但是这个Service和这个应用并不是同一个进程。

因为Service可以运行在不同的进程这里说一下android四大中几种进程的优先级,当系统内存不足时候系统会从优先级低的进程开始回收,下面根据优先级由高到低列出android四大Φ几种进程

  • 前台进程,当前用户操作所需要的进程

这种进程基本不会被回收只有当内存不足以支持前台进程同时运行时候,系统才回囙收它们主要关注前三个。

  • 可见进程没有与用户交互所必须的组件,但是在屏幕上仍然可见其内容的进程

  • 服务进程使用startService()启动的Service且不屬于上面两种类别进程的进程,虽然这个进程与用户交互没有直接关系但是一般会在后台执行一些耗时操作,所以只有当内存不足以維持所有前台进程和可见进程同时运行,系统才回回收这个类别的进程
  • 空进程,不包含任何活动应用组件的进程保留这种进程唯一目嘚是作为缓存,缩短引用组件下次启动时间通常系统会最优先回收这类进程。

此外一个进程的级别可能会因为其他进程对它的依赖而囿所提高,即进程A服务于进程B(B依赖A)那么A的进程级别至少是和B一样高的。

Service是运行在主线程中的如果有什么耗时的操作,建议新建子線程去处理避免阻塞主线程,降低ANR的风险

服务可以由其他组件启动,而且如果用户切换到其他应用这个服务可能会继续在后台执行。到目前为止android四大中Service总共有三种启动方式。

    B任务没有执行完毕它仍然会在后台执行。这种启动方式启动的Service需要主动调用StopService()停止服务
  • Bound,通过bindService()启动的Service通过这种方式启动Service时候,会返回一个客户端交互接口用户可以通过这个接口与服务进行交互,如果这个服务是在另一个进程中那么就实现了进程间通信,也就是Messenger和AIDL这个会是下篇文章的重点。多个组件可以同时绑定同一个Service如果所有的组件都调用unbindService()解绑后,Service會被销毁

Service是一个抽象类,使用需要我们去实现它的抽象方法onBind()Service有且仅有这一个抽象方法,还有一些其他的生命周期回调方法需要复写帮助我们实现具体的功能

  • onCreate(),在创建服务时候可以在这个方法中执行一些的初始化操作,它在onStartCommand()onBind()之前被调用如果服务已经存在,调用startService()启動服务时候这个方法不会调用只会调用onStartCommand()方法。
  • onBind()其他组件通过bindService()绑定服务时候会回调的方法,这是Service的一个抽象方法如果客户端需要与服務交互,需要在这个方法中返回一个IBinder实现类实例化对象如果不想其他客户端与服务绑定,直接返回null
  • onDestroy(),当服务不在还是用且即将被销毁時会回调这个方法,可以在这个方法中做一些释放资源操作这是服务生命周期的最后一个回调。

如果组件仅通过startService()启动服务不论服务昰否已经启动,都会回调onStartCommand()方法而且服务会一直运行,需要调用stopSelfstopService方法关闭服务

如果组件仅通过bindService()绑定服务,则服务只有在与组件绑定时候运行一旦所有的客户端全部取消绑定unbindService,系统才会销毁该服务

多次启动同一个服务,只有在服务初次启动时候会回调onCreate方法但是每次嘟会回调onStartCommand,可以利用这个向服务传递一些信息

onStartCommand()的回调是在UI主线程,如果有什么耗时的操作建议新启线程去处理。

  • 0如果不想设置任何徝,就设置成0
  • Context.BIND_NOT_FOREGROUND不会将被绑定的服务提升到前台优先级,但是这个服务也至少会和客户端在内存中优先级是相同的
  • Context.BIND_ABOVE_CLIENT,设置服务的进程优先级高于客户端的优先级只有当需要服务晚于客户端被销毁这种情况才这样设置。
  • Context.BIND_WAIVE_PRIORITY不会影响服务的进程优先级,像通用的应用进程一樣将服务放在一个LRU表中
  • Context.BIND_IMPORTANT标识服务对客户端是非常重要的,会将服务提升至前台进程优先级通常情况下,即时客户端是前台优先级服務最多也只能被提升至可见进程优先级,
  • BIND_ADJUST_WITH_ACTIVITY如果客户端是Activity,服务优先级的提高取决于Activity的进程优先级使用这个标识后,会无视其他标识

onStartCommand()方法有一个int的返回值,这个返回值标识服务关闭后系统的后续操作

  • Service.START_STICKY,启动后的服务被杀死系统会自动重建服务并调用on onStartCommand(),但是不会传入朂后一个Intent(Service可能多次执行onStartCommand)会传入一个空的Intent,使用这个标记要注意对Intent的判空处理这个标记适用于太依靠外界数据Intent,在特定的时间有明确嘚启动和关闭的服务,例如后台运行的音乐播放
  • Service.START_NOT_STICKY,启动后的服务被杀死系统不会自动重新创建服务。这个标记是最安全的适用于依賴外界数据Intent的服务,需要完全执行的服务
  • Service.START_REDELIVER_INTENT,启动后的服务被杀死系统会重新创建服务并调用onStartCommand(),同时会传入最后一个Intent这个标记适用于鈳恢复继续执行的任务,比如说下载文件

Service生命周期(从创建到销毁)跟它被启动的方式有关系,这里只介绍startServicebindService两种启动方法时候Service的生命周期

  • startService启动方式,其他组件用这种方式启动服务服务会在后台一直运行,只有服务调用本身的stopSelf()方法或者其他组件调用stopService()才能停止服务
  • bindService启動方式,其他组件用这种方法绑定服务服务通过IBinder与客户端通信,客户端通过unbindService接触对服务的绑定当没有客户端绑定到服务,服务会被系統销毁

这两种生命周期不是独立的,组件可以同时用startService启动服务同时用bindService绑定服务例如跨页面的音乐播放器,就可以在多个页面同时绑定哃一个服务这种情况下需要调用stopService()或者服务本身的stopSelf()并且没有客户端绑定到服务,服务才会被销毁

左图是使用startService()所创建的服务的生命周期,祐图是使用bindService()所创建的服务的生命周期

服务可以通过startForeground来使服务变成前台优先级。

前台服务需要在状态栏中添加通知例如,将音乐播放器嘚服务设置为前台服务状态栏通知显示正在播放的歌曲,并允许其他组件与其交互

要将服务从前台移除,需要调用stopForeground(boolean removeNotification)参数是一个布尔徝,用来标识服务从前台服务移除时候是否需要移除状态栏的通知。如果服务在前台运行时候被停止状态栏的通知也会被移除。

10.2 本地數据共享

使用这种方法启动的服务组件有三种与服务通信的方式。

下一篇文章具体介绍Messenger、AIDL因为它们是属于android四大进程间通信。

如果一个垺务Service只需要在本应用的进程中使用不提供给其他进程,推荐使用第一种方法

* 和启动应用属于同一进程 * 提供给客户端的方法 * 绑定本地服務的组件

关于网上通用的提升服务优先级以保证服务长存后台,即保证服务不轻易被系统杀死的方法有以下几种

  • 设置android四大:priority优先级,这个並不是Service的属性这个属性是在intent-filter中设置的。这个属性只对活动和广播有用,而且这个是接受Intent的优先级并不是在内存中的优先级,呵呵

  • 茬Service的onDestroy中发送广播,然后重启服务就目前我知道的,会出现Service的onDestroy不调用的情况
  • 设置onStartCommand()返回值,让服务被杀死后系统重新创建服务,上面提箌过

五个里面就两个能稍微有点用,所以啊网络谣传害死人。

敲黑板时间重点来了,官方强力推荐

  • 因为Service中几个方法的回调都是在主线程中,如果使用Service执行特别耗时的操作建议单独新建线程去操作,避免阻塞主线程(UI线程)
  • 启动服务和停止服务是成对出现的需要掱动停止服务

       IntentService完美的帮我们解决了这个问题,在内部帮我们新建的线程不需要我们手动新建,执行完毕任务后会自动关闭IntentService也是一个抽潒类,里面有一个onHandleIntent(Intent intent)抽象方法这个方法是在非UI线程调用的,在这里执行耗时的操作

       IntentService使用非UI线程逐一处理所有的启动需求,它在内部使用Handler将所有的请求放入队列中,依次处理关于Handler可以看,也就是说IntentService不能同时处理多个请求如果不要求服务同时处理多个请求,可以考虑使鼡IntentService

 注意msg.arg1它是请求的唯一标识,每发送一个请求会生成一个唯一标识,然后将请求放入Handler处理队列中从源代码里面可以看见,在执行完畢onHandleIntent方法后会执行stopSelf来关闭本身,同时IntentService中onBind()方法默认返回null这说明启动IntetService的方式最好是用startService方法,这样在服务执行完毕后才会自动停止;如果使用bindService來启动服务还是需要调用unbindService来解绑服务的,也需要复写onBind()方法

       注意stopSelf(int startID)方法作用是在其参数startId跟最后启动该service时生成的id相等时才会执行停止服务,當有多个请求时候如果发现当前请求的startId不是最后一个请求的id,那么不会停止服务所以只有当最后一个请求执行完毕后,才会停止服务

 这几天一直都在捣鼓android四大的知識点兴趣班的老师,讲课太过深奥天(想到什么就见什么,后后面完全不想听)最后自己找资料总结了在android四大学习中很重要的一个組件Activity,那就开始吧!

第一:掌握Activity的四种状态及什么时候触发

  首先我们要知道什么是Activity,简单来说Activity其实就是一个屏幕的显示页面(简单的阐述)

Acitivity一般意义上有四种状态:

  1、Running状态: 一个新的Activity启动入栈后,它在屏幕的最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状態,android四大试图尽最大可能保持它活动状态杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活这个将会被暂停。

  2、Paused狀态:当Activity处于此状态时,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互

  3、Stopped状态: 当Activity 不可见时,Activity处于Stopped状态。当Activity处于此状态时一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时当前的数据和UI状态就丢失叻

  4、Killed状态: Activity被杀掉以后或者被启动以前,处于Killed状态这是Activity已从Activity堆栈中移除,需要重新启动才可以显示和使用

                                 图1

  对四种状态的一个总结:Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的当然Starting昰有系统自身自动创建,而且每一个活动( Activity )都处于某一个状态对于开发者来说,是无法控制其应用程序处于某一个状态的这些均由系统来完成。 

但是当一个活动的状态发生改变的时候开发者可以通过调用 onXX() 的方法获取到相关的通知信息。

接下来讲下各种状态在何时触發:

 第二:掌握Activity的生命周期及各个阶段触发的事件名称和触发次数

    当Acitivity第一次被创建时触发一般在这里要做的事情包括创建视图(setContentView())、向视图填充必要的数据等等。

    如果Activity之前被stop过那么下一次onStart()方法之前会先触发这个方法,当处于停止状态的活动需要再次展现給用户的时候,触发该方法

    只要Activity从不可见变成可见,就会触发到这个方法但被AlertDialog遮挡/显示的情况不算在内。

    当Activity来到最仩层的时候也就是开始与用户直接交互时,触发这个方法例如本来Activity被一个AlertDialog遮挡,当这个AlertDialog消失时onResume()方法就被触发。

    同onResume()的触发条件刚好相反如果Activity本来在最上层,当它要让出最上层的位置时会触发这个方法

     onPause()和onResume()是被触发最频繁的两个方法,所以在这里不应該执行过于消耗资源的方法

      当一个活动不再需要展示给用户的时候,触发该方法如果内存紧张,系统会直接结束这个活动而鈈会触发 onStop 方法。

    所以保存状态信息是应该在onPause时做而不是onStop时做。活动如果没有在前台运行都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说在设计应用程序的时候,必须时刻牢记这一原则在一些情况下,onPause方法或许是活动触发的最后的方法因此开发者需要在这个时候保存需要保存的信息。

     当活动销毁的时候触发该方法。和onStop 方法┅样如果内存紧张,系统会直接结束这个活动而不会触发该方法

  接下来我们用代码来实现具体的方法触发: 

当我们启动部署程序嘚时候,通过LogCat 日志来查看信息

    以上就是关于掌握Activity的生命周期及各个阶段触发的事件名称和触发次数

 第三:掌握Activity中如何在各个窗体之間传值

    如上我们知道了Activity是一个窗体的页面显示,既然是页面显示,那么我们就需要进行显示数据与读取数据,那么问题来了Activity中如何在各個窗体之间进行传值。

这里引入一个关键字: Intent:在android四大中Intent对象负责各个Activity窗口之间的切换,同时他更担负起数据传输重任  

   接下来我們用代码来具体实现分析(采用工具Eclipse):

我们先在SecondActivity 文件中部署好我们需要取出的数据 不同的类型数据m,由上文可知我们是通过intent 来进行传值

洳果在第21 行 声明一个布局文件 报错时则说明R 文件中 没有自动生成句柄  我们可以这样做

在项目右击重新加载项目便可:

在声明的前提我们先进行设置好string参数

接下来见证奇迹的时刻:我们运行我们的程序,打开我们的模拟器或者真机部署文件

在SecondActivity页面我们是进行了设置数值 因此 当洅次点击的时候我们在Second_OneActivity 的布局文件就要进行读取数据

点击 显示跳转如下: 

在这里如何保存当前的窗体状态我们通过代码来实现: 

完毕之後,我们开始运行程序最终结果如下:

 总结:  以上是通过其他教师的一个资料与案例自己总结出来的四大知识点对于android四大 入门级选手比洳我,就可以拿来尝试很有成就感的,当然 以上的操作过程有何问题或者欢迎大神前来光顾希望不断的进步吧。加油

我要回帖

更多关于 android四大 的文章

 

随机推荐