Service和BroadcastReceiver总结

来源:互联网 发布:html a 调用js 编辑:程序博客网 时间:2024/05/14 05:42
Service
1、service的隐式启动和显示启动( 如果在同一个包中。两者都可以用。在不同包时。只能用隐式启动)
    隐式启动
        <service android:name=".service">
            <intent-filer>
                <action android:name="com.android.service"/>
            <intent-filer>
        </service>
        final Intent serviceIntent=new Intent();
        serviceIntent.setAction("com.android.service");
    显示启动
        final Intent serviceIntent=new Intent(this,service.class);
        startService(serviceIntent);
2、activity对service的调用:startService()和bindService()
     两者生命周期的区别

     1)startService()方法
      这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。 当service被停止时,系统会销毁它。多次调用startService(),只会调用1次onCreate(),但会多次调用onStartCommand()方法。
     2)bindService()方法
        客户可以通过一个IBinder接口和service进行通信。 客户可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
         IBinder对象相当于Service组件中的内部钩子,可以访问Service内部数据,Activity通过IBinder类和Service通信。在实际开发中,通常在Service中定义一个Binder的子类。
         bindService(Intent service, ServiceConnection conn, int flags),启动Service。ServiceConnection类,用于监听访问者和Service之间的链接情况。当activity和service链接成功后回调ServiceConnection对象的onServiceConnected方法,可在该方法中获取IBinder对象。
        多次调用 bindService(),只会调用1次onCreate()和onBind()方法。
3)IntentService的使用
      Service不是一条新线程,不应该在其中处理耗时任务。Service不会启动一个单独的线程,它与所在应用处于同一个进程中。
     intentservice是Service的子类,只需要实现onHandleIntent()方法

BroadcastReceiver
BroadcastReceiver是一个系统级的全局监听器,能够实现不同组件之间的通信。在实现BroadcastReceiver时,主要实现其中的onReceiver()方法,但是不能执行耗时操作。
1、使用步奏
       1)注册BroadcastReceiver,代码注册或者xml注册
       2)创建Intent,用于启动BroadCastReceiver
       3)调用指定BroadcastReceiver:Context的sendBroadcast()或者sendOrderedBroadcast
2、注册
      1)代码注册(适合将BroadcastReceiver作为内部类使用)
         IntentFilter filter=new IntentFilter("android.provider.xxx");//intent过滤器
         MyReceiver receiver=new MyReveiver();//Receiver对象
         registerReceiver(receiver,filter);//注册//unregisterReceiver(receiver);//取消注册
      2)AndroidManifest.xml注册(适合将BroadcastReceiver单独的类)
       <intent-filter>
                <action android:name="com.simware.BroadcastReceiverDemo" >
                </action>
      </intent-filter>  
3、普通广播和有序广播
     1)普通广播(Normal Broadcast):系统异步发送广播,同一时刻可以被所有接受者受到,效率高,但接受者不能将处理结果传递给下一个接受者。通过Context的sendBroadcast()发送普通广播
     2)有序广播(Ordered Broadcast):接受者将按照实现规定的优先级依次接收Broadcast。接收者可以终止Broadcast Intent的传播,低优先级的接收者将不会受到广播。同时接受者可以将数据传递给下一个接受者:setResultExtras(Bundle)来存放数据和getResultExtras(true)来接收上级广播的数据;通过Context的sendOrderedBroadcast()发送普通广播
       <intent-filter android:priority="20">
                <action android:name="com.simware.BroadcastReceiverDemo" >
                </action>
      </intent-filter>  

Service和Activity的通信方式
1、bindService()启动service,通过内部钩子IBinder对象实现两者的沟通
2、startService()启动service,借助BroadcastReceiver来实现数据通信,此时最好将Receiver定义为Activity的内部类,这样Receiver可以直接操控activity的数据。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家里地下污水管道堵塞怎么办 家里pvc灯罩变黄怎么办 欧普吸顶灯灯罩坏了怎么办 硬盘用久了变慢怎么办 地税申报工资人员弄错怎么办 买保险保单丢了怎么办 买保险的银行卡丢了怎么办 没学过JAVA入职怎么办 磨砂皮擦了鞋油怎么办 磨破皮伤口有沙子怎么办 工行信用卡被风险锁定了怎么办 超重被超限站查住以后怎么办 银行卡输入密码次数超限怎么办 信用卡密码错误次数超限怎么办 农行密码错误次数超限怎么办 剪力墙偏心受拉怎么办 韵达快递寄丢了怎么办 重要快递送丢了怎么办 快递员送货丢了怎么办 买的快递丢失了怎么办 申通把件弄丢了怎么办 淘宝快递送丢了怎么办 我的快递丢了怎么办 顺丰快递丢件怎么办 韵达快递不发货怎么办 发物流丢了怎么办啊 圆通快递寄丢了怎么办 中通快递弄丢了怎么办 中通快递寄丢了怎么办 中通快递丢了怎么办 物流没保价坏了怎么办 顺丰保值快递丢了怎么办 顺丰保价件丢失怎么办 公司购买货物对方没有发票怎么办 加工货物对方不取怎么办 物流发货发错了怎么办 货车拉的货丢了怎么办 壹米滴答丢货怎么办 物流东西弄丢了怎么办 理赔款账号打错了怎么办 顺丰快递搞丢了怎么办