您的位置:首页 > 移动开发 > Android开发

Android_07_自定义广播

2015-10-21 14:16 281 查看
前言:

sendBroadcast()可用来发送广播,关于广播的接收,第一种方法是通过registerReceiverr()动态进行注册广播,

第二种方法就是静态地在清单文件中去声明一个广播

Note:

如果你通过registerReceiverr()在Activity.onResume()方法体中注册广播,那么相应地你应该在Activity.onPause()方法中

将这个注册的广播记得销毁掉;

需要知道的是:尽管intent被用来发送和接收广播,但是intent的广播机制和被用来启动一个activity的intent,两者是完全独立的;

安全:

1>

intent是全局的命名空间,确保intent的action和其他字符串都是以你自己的命名空间来命名的,否则的话,可能会造成与其他应用的冲突;

2>

当你使用registerReceiver(BroadcastReceiver, IntentFilter)的时候,任何一个应用都可能会发送广播给这个注册的广播接收者,你可以

通过在下边描述的一些权限来控制谁可以发送广播给这个广播接收者;

3>

当你通过清单文件去声明一个广播接收者且通过intent-filters去指定一个特定类型的广播时,任何一个应用都可以发送广播给这个广播接收者,

无论这个被指定的intent-filters多么的特殊化;为了阻止外部的应用可以发送广播给这个广播接收者,你可以通过android:exported=false来阻止

外部应用的广播对被应用广播接收者的干扰;

4>

当你使用sendBroadcast或相关的方法时,通常任何其他应用程序可以接收这些广播,你可以通过以下权限的描述来实现谁可以接收到这些广播;

当然,你也可以通过Intent.setPackage来严格地限制其只能与某个单独的应用进行广播的发送;

当使用LocalBraodcastManaget的时候,上述所这些问题都将不会存在;因为intent广播不会跑出当前进程之外去;

(关于LocalBraodcastManaget的使用,可参考LocalBroadcastManager的使用总结)

访问权限可以由广播的接收者或广播的发送者来执行;为了在发送时去执行一个权限,你需要提供一个非空的参数给sendBroadcast(Intent, String)

 或者 sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle). 为了在接收时执行一个权限,要么可以

通过调用 registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)或者在你自己的AndroidManifest.xml的 <receiver>里边去

提供一个非空的权限;

代码示例如下:

自定义的广播发送端:

package com.example.administrator.testsendbroadcast;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class SendBroadcastActivity extends AppCompatActivity {

private final static String TAG = "testBroadcast";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_broadcast);
Intent intent = new Intent();
intent.setAction(TAG);
Log.e("SendBroadcastActivity","sendBroadcast");
sendBroadcast(intent);
}
}


广播接收端一:(通过registerReceiver()来实现,这时就无需再在清单文件中进行配置了)

package com.example.administrator.receiverbyregister;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class ReceiverByRegisterActivity extends AppCompatActivity {

private final static String TAG = "testBroadcast";
private BroadcastReceiverByRegister broadcastReceiverByRegister;
private IntentFilter intentFilter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receiver_by_register);
/**
* 注册并侦听广播
* **/
intentFilter = new IntentFilter();
intentFilter.addAction(TAG);
broadcastReceiverByRegister = new BroadcastReceiverByRegister();
registerReceiver(broadcastReceiverByRegister,intentFilter);
}

private class BroadcastReceiverByRegister extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.e("ReceiverByRegister","onReceive");
}
}

/**
* 注销广播
* **/
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(broadcastReceiverByRegister);
}
}


广播接收端二:(通过在清单文件中进行注册<receiver>并配置action来决定其侦听哪类广播)

package com.example.administrator.receiverbyreceiver;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

/***
* 在本个示例中,这个Activity什么都没做
* **/
public class ReceiverByReceiverActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receiver_by_receiver);
}
}


在接收端二中,主要看以下两部分:

package com.example.administrator.receiverbyreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class ReceiverByReceiver extends BroadcastReceiver {
public ReceiverByReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {
Log.e("ReceiverByReceiver","onReceive");
}
}


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.receiverbyreceiver">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ReceiverByReceiverActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver
android:name=".ReceiverByReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="testBroadcast"></action>
</intent-filter>
</receiver>
</application>

</manifest>


运行结果如下:







总结:

广播的发送时通过sendBroadcast()来进行发送,广播的接收有两种方式:

一种是registerReceiver()来动态进行注册,一种是通过在清单文件中进行配置,决定其来侦听什么广播

源码:

1>

自定义广播发送端源码

2>

广播接收端一源码

3>

广播接收端二源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: