美文网首页
Broadcast

Broadcast

作者: Passon_Fang | 来源:发表于2016-03-22 18:48 被阅读62次

    广播接收者 BroadcastReceiver

    onReceive()方法里面对获取的广播进行处理。

    onReceive里面开启一个activity的方法:

    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(intent);
    

    拦截广播:abortBroadcast();对有序广播才有效

    原因:Receiver没有任务栈,启动activity的时候要新建一个任务栈,这里改变了活动的启动方式

    广播注册

    静态注册:在xml清单文件这个注册

    广播不会强制要求注册,不报错

    注册文件中的一些设置

    • 优先级:android:priority="10"intent-fliter过滤器的属性
    • 常用监听项:
      • android.intent.action.BATTERY_CHANGED
      • android.intent.action.NEW_OUTGOING_CALL
      • android.intent.action.PHONE_STATE
      • android.provider.Telephony.SMS_RECEIVED
      • android.net.conn.CONNECTIVITY_CHANGE
      • android.intent.action.HEADSET_PLUG
      • android.intent.action.SCREEN_OF
      • android.intent.action.SCREEN_ON
      • android.intent.action.BOOT_COMPLETED

    注意:有些监听需要加权限,对于敏感权限需要在code里面确定获取。

    获取权限方法

    注意:权限获取的代码执行完后,在执行需要权限的代码的时候还是要判断一下是否获取了权限。

        // 获取敏感权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE},0);
        }
    

    相应的结果方法:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(MainActivity.this, "权限获取成功", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(MainActivity.this, "权限获取失败", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
    

    获取失败可以有两种操作方法:1. 结束activity 2. 继续获取权限 3. 如果这个权限不是必要的就可以不操作

    动态注册

    动态注册方式需要注册代码执行后,app才能获取接收广播的功能。

    动态注册的优先级和静态注册一样的时候,动态注册会先收到广播

    注册代码:

    OtherReceiver receiver = new OtherReceiver();
    IntentFilter filter = new IntentFilter();
    fliter.setPriority(30);
    fliter.addAction(....);
    registerReceiver(receiver, fliter);
    

    本地广播

    本地广播发送的广播,只能被在本地广播注册的receiver接收

    通过本地广播管理器注册的接收器只能接收本地广播发出的广播。

    • 获取本地广播管理器:LocalBroadcastManager manager= LocalBroadcastManager.getInstance(this);
    • 通过本地广播管理器注册receivermanager.registerReceiver(mOReceiver, fliter);
    • 通过本地广播管理器发送广播Intent intent = new Intent(.action..);manager.sendBroadcast(intent);

    注意:接收者可以同时在本地和全局注册

    有序广播与无序广播

    sendOrderedBroadcast(intent,null);
    sendBroadcast(intent);

    相关文章

      网友评论

          本文标题:Broadcast

          本文链接:https://www.haomeiwen.com/subject/qhdllttx.html