当前位置:   article > 正文

Android项目之广播(BroacastReceiver)与服务(Service)_广播中调用context.startservice(serviceintent)为什么没有启动?

广播中调用context.startservice(serviceintent)为什么没有启动?

前言:

在我写博客前再声明一下,我希望经过我同意装载我文章的某某某记得注明:本文来自http://blog.csdn.net/qq_29269233,要尊重我的劳动成果,这样才能给我更多的支持和鼓励!今天我就接着上一篇博客:Android项目之webview简单使用,在上一篇博客的基础上添加自动启动并打开应用的功能!应用自启是利用了Broacastreceiver和service。


一、简单介绍:

BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息,无法被用户直接感知,因为它工作在系统内部。BroadcastReceiver也叫广播,广播

的注册有两种方式:静态注册和动态注册。


Service是一种计算型组件,用于在后台执行一系列计算任务。由于Service组件工作在后台,因此也无法让用户直接感知到它的存在。Service分为两种工作状态,一种是启动

状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和service的交互。



(一)、BroadcastReceiver

清单文件中配置:
  1. <receiver android:name="包名.广播接收者文件" >
  2. <intent-filter android:priority="广播拦截的优先级(最大:2147483647)" >
  3. <action android:name="广播监听的动作 可以是自定义的或者系统广播" />
  4. </intent-filter>
  5. </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
动态注册广播接收者
1.动态创建一个广播接收者
  1. class MyReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. //收到广播后
  5. //1.可以触发某些事件
  6. //2.从initen参数中获取广播发送的数据
  7. }
  8. };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
2.对广播接收者进行动态注册
  1. Receiver = new MyReceiver();
  2. //设置filter信息
  3. IntentFilter filter = new IntentFilter();
  4. filter.addAction("自定义的或者系统广播"); //设置广播监听的动作
  5. //注册
  6. registerReceiver(Receiver, filter);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
3.取消注册
  1. unregisterReceiver(mReceiver);
  2. mReceiver = null;
  • 1
  • 2
  • 1
  • 2
自定义广播发送(通过intent携带数据)
  1. Intent intent = new Intent();
  2. intent.putExtra("键", 要携带到接收者的信息);
  3. intent.setAction("自定义广播"); //设置广播监听的动作
  4. sendBroadcast(intent);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
两种广播的区别
  1. 静态注册广播接收者在程序的整个运行期间都会监听。
  2. 动态注册的广播接收者可以控制在需要的时候开启监听,不需要的时候关闭监听。通常可以将动态注册广播接收者放到一个服务中,服务开启时注册广播,服务关闭时取消注册。

.例子

常见系统广播
    //监听系统启动广播
  1. <receiver android:name=".receiver.BootCompleteReceiver" >
  2. <intent-filter>
  3. <action android:name="android.intent.action.BOOT_COMPLETED" />
  4. </intent-filter>
  5. </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
    //监听短信
  1. <receiver android:name=".receiver.SmsReceiver" >
  2. <intent-filter android:priority="2147483647" >
  3. <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  4. </intent-filter>
  5. </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
    //获取管理员权限  MyAdminReceiver需要实现但是不用写内容
  1. <receiver
  2. android:name=".receiver.MyAdminReceiver"
  3. android:description="@string/sample_device_admin_description"
  4. android:label="@string/sample_device_admin"
  5. android:permission="android.permission.BIND_DEVICE_ADMIN" >
  6. <meta-data
  7. android:name="android.app.device_admin"
  8. android:resource="@xml/device_admin_sample" />
  9. <intent-filter>
  10. <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
  11. </intent-filter>
  12. </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
    //监听创建快捷方式
  1. <receiver android:name=".receiver.MyWidget" >
  2. <intent-filter>
  3. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  4. </intent-filter>
  5. <meta-data
  6. android:name="android.appwidget.provider"
  7. android:resource="@xml/process_widget_provider" />
  8. </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
    //监听杀死所有进程
  1. <receiver android:name=".receiver.KillProcess">
  2. <intent-filter>
  3. <action android:name="com.example.mobilesafe.KILLALLPROCESS" />
  4. </intent-filter>
  5. </receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
动态注册广播接收者(一般在服务中动态注册 重要)
适用情况: 广播接收者监听事件变化,有变化后就返回给服务,服务通过返回Bind或者写SharePrecefence等方法传出数据。
具体运用举例:
1.开启电话监听,监听来电去电 ,例如 黑名单,归属地查询等
2.程序加锁 ,监听当前栈顶程序是否被加锁
3.实时定位 ,不断读取当前定位信息
4.锁屏事件 ,监听到锁屏后可以做一些清理工作
5.和桌面上的Widget通信


(二)、Service:

注册一个服务
  1. 清单文件
  2. <service android:name=".service.MyService" />
  3. public class MyService extends Service {
  4. @Override
  5. public IBinder onBind(Intent intent) {
  6. return null;
  7. }
  8. //创建服务的时候调用
  9. @Override
  10. public void onCreate() {
  11. System.out.println("*****onCreate******");
  12. super.onCreate();
  13. }
  14. //启动server 每次start都会调用一次
  15. @Override
  16. public int onStartCommand(Intent intent, int flags, int startId) {
  17. System.out.println("*****onStartCommand******");
  18. return super.onStartCommand(intent, flags, startId);
  19. }
  20. //手动停止程序后会终止服务,会调用onDestroy()方法
  21. @Override
  22. public void onDestroy() {
  23. System.out.println("*****onDestroy******");
  24. super.onDestroy();
  25. }
  26. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
开启一个服务
  1. 1.启动
  2. //使用Intent
  3. Intent intent = new Intent(当前Activity.this, MyService.class);
  4. startService(intent);
  5. stopService(intent);
  6. 2.使用bind让其他组件获取服务提供的数据
  7. //使用Intent
  8. Intent intent = new Intent(当前Activity.this, MyService.class);
  9. bindService(intent, conn, BIND_AUTO_CREATE);
  10. unbindService(conn);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
注意事项
  1. bindService绑定服务、unBindService解除绑定的服务;
  2. 服务是在被绑定的时候被创建,调用oncreate、onbind方法;
  3. 服务只能被绑定一次;
  4. 服务只能被解除一次,接触绑定的时候调用onUnbind、onDestrory方法,如果多次解除绑定会抛出异常;
  5. 推荐的方式(启用顺序):
  6. 1.startService:开启并创建一个服务,服务长期运行在后台;
  7. 2.bindService:绑定服务,可以调用服务里面的方法;
  8. 3.unBindService:解除服务,停止服务里面的方法;
  9. 4.stopService:停止服务,销毁服务对象;


二、说到这里应该都算了解BroacastReceiver和Service了,现在我就接着上一篇博客:《Android项目之webview简单使用》,在上一篇博客的基础上添加自动启动并打开应用的功能

1、配置AndroidManifest

  1. <!--服务-->
  2. <service android:name=".BootService" >
  3. </service>
  4. <!--广播-->
  5. <receiver android:name=".BootBroadcastReceiver" >
  6. <intent-filter>
  7. <action android:name="android.intent.action.BOOT_COMPLETED" />
  8. </intent-filter>
  9. </receiver>

添加权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

2、BootBroadcastReceiver广播监听类“BootBroadcastReceiver”

  1. import android.content.BroadcastReceiver;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. /**
  5. * Created by Administrator on 2016/11/20 0020.
  6. */
  7. public class BootBroadcastReceiver extends BroadcastReceiver {
  8. // 系统启动完成
  9. static final String ACTION = "android.intent.action.BOOT_COMPLETED";
  10. @Override
  11. public void onReceive(Context context, Intent intent) {
  12. // 当收听到的事件是“BOOT_COMPLETED”时,就创建并启动相应的Activity和Service
  13. if (intent.getAction().equals(ACTION)) {
  14. // 开机启动的Activity
  15. Intent activityIntent = new Intent(context, MainActivity.class);
  16. activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  17. // 启动Activity
  18. context.startActivity(activityIntent);
  19. // 开机启动的Service
  20. Intent serviceIntent = new Intent(context, BootService.class);
  21. // 启动Service
  22. context.startService(serviceIntent);
  23. }
  24. }
  25. }

3、开启Service设置

  1. import android.app.Service;
  2. import android.content.Intent;
  3. import android.os.IBinder;
  4. import android.support.annotation.Nullable;
  5. import android.widget.Toast;
  6. /**
  7. * Created by Administrator on 2016/11/20 0020.
  8. */
  9. public class BootService extends Service{
  10. @Nullable
  11. @Override
  12. public IBinder onBind(Intent intent) {
  13. return null;
  14. }
  15. @Override
  16. public int onStartCommand(Intent intent, int flags, int startId) {
  17. // Service被启动时,将会有弹出消息提示[c]
  18. Toast.makeText(this, "[开启我的服务]", Toast.LENGTH_LONG).show();
  19. return super.onStartCommand(intent, flags, startId);
  20. }
  21. }

开机自启的效果如下:












声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/902097
推荐阅读
相关标签
  

闽ICP备14008679号