zoukankan      html  css  js  c++  java
  • 2018-2019-2 20189205《移动平台应用开发实践》第十二周作业

    Android学习

    服务

    一个Android应用主要由四个基本组件组成,Android四大基本组件分别是Activity,Content Provider内容提供者,Service服务,BroadcastReceiver广播接收器。
    Services(服务)简单来说就是剥夺界面的Activity。它和Activity很多概念都是相似的,都是封装有一个完整的功能逻辑实现。
    Services是运行在后台的一段代码,它可以运行在它自己的进程,也可以运行在其他应用程序进程的上下文(context)里面,其它的组件可以绑定到一个服务(Service)上面,通过远程过程调用(RPC)来调用这个方法。常见的Services如后台音乐播放,后台计算数据。

    运行原理

    服务有两种运行方式,原理如下:

    • a、使用Context.startService()来启动一个Service,从而可以在后台调用Service。同时,系统也将保持这个Service一直执行,直到这个Service运行结束。
    • b、使用Context.bindService()方法,连接到一个Service上(如果这个Service还没有运行将启动它)。当连接到一个Service之后,我们还可以Service提供的接口与它进行通讯。

    生命周期

    官方生命周期的图示:

    • a、startService后,即使调用startService的进程结束了,Service仍然还存在,直到有进程调用stopService,或者Service自己自杀(stopSelf())。
    • b、bindService后,Service就和调用bindService的进程同生共死了,也就是说当调用bindService的进程死了,那么它bind的Service也要跟着被结束,当然期间也可以调用unbindservice让 Service结束。
    • c、两种方式混合使用时,比如说你startService了,我bindService了,那么只有你stopService了而且我也unbindservice了,这个Service才会被结束。

    使用步骤

    a、继承service类(位于android.app包下,一般用它的子类IntentService)

    b、AndroidManifast.xml配置清单文件中节点里对服务进行配置
    <service name=".XXXX"/>
    c、服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务
      通过startService()方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onStart(),如果服务已经启动再次调用只会触发onStart()方法使用bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()-->onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-->onDestory();
    区别使用 startService()还是bindService()就要看是否要和调用者进行通信,由于startService()和访问者不存在太多联系,所有有进行通信的要用bindService()。通过Service提供IBinder OnBind(Intent intent) 返回要通信的数据,在OnServiceConnected()方法 返回该Binder给调用者。

    广播接收器

    广播接收器用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。例如,应用程序可以初始化广播来让其他的应用程序知道一些数据已经被下载到设备,并可以为他们所用。这样广播接收器可以定义适当的动作来拦截这些通信。

    有以下两个重要的步骤来使系统的广播意图配合广播接收器工作。

    • 创建广播接收器
    • 注册广播接收器

    创建广播接收器

    广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息。

    public class MyReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context context, Intent intent) {
          Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
       }
    

    注册广播接收器

    应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。假设我们将要注册MyReceiver来监听系统产生的ACTION_BOOT_COMPLETED事件。该事件由Android系统的启动进程完成时发出。

    <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
       <receiver android:name="MyReceiver">
    
          <intent-filter>
             <action android:name="android.intent.action.BOOT_COMPLETED">
             </action>
          </intent-filter>
    
       </receiver>
    </application>
    

    现在,无论什么时候Android设备被启动,都将被广播接收器MyReceiver所拦截,并且在onReceive()中实现的逻辑将被执行。

    有许多系统产生的事件被定义为类Intent中的静态常量值。下面列举了重要的系统事件。

    • android.intent.action.BATTERY_CHANGED 持久的广播,包含电池的充电状态,级别和其他信息。
    • android.intent.action.BATTERY_LOW 标识设备的低电量条件。
    • android.intent.action.BATTERY_OKAY 标识电池在电量低之后,现在已经好了。
    • android.intent.action.BOOT_COMPLETED 在系统完成启动后广播一次。
    • android.intent.action.BUG_REPORT 显示报告bug的活动。
    • android.intent.action.CALL 执行呼叫数据指定的某人。
    • android.intent.action.CALL_BUTTON 用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。
    • android.intent.action.DATE_CHANGED 日期发生改变。
    • android.intent.action.REBOOT 设备重启。
  • 相关阅读:
    Unknown column '××' in 'where clause',出现这个问题,如何处理?
    mysql 安装失败 start service执行不下去
    2019第十届蓝桥杯国赛总结
    Win10中小娜无法搜索本地应用
    计蒜客 青出于蓝胜于蓝(dfs序+树状数组)
    计蒜客 棋子等级
    蓝桥杯 国王的烦恼(并查集)
    keras+theano+tensorflow+darknet
    caffe with anaconda
    matconvnet编译
  • 原文地址:https://www.cnblogs.com/hzj20189205/p/10890573.html
Copyright © 2011-2022 走看看