一、创建并登记standalone receiver
创建一个StartupReceiver.java
1.第一个broadcast receiver(StartupReceiver.java)
private static final String TAG = "StartupReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Received broadcast intent: " + intent.getAction());
2.在manifest文件中添加receiver(AndroidManifest.xml)
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".StartupReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
3.添加定时器状态preference(QueryPreferences.java)
private static final String PREF_IS_ALARM_ON = "isAlarmOn";
public static boolean isAlarmOn(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean(PREF_IS_ALARM_ON, false);
}
public static void setAlarmOn(Context context, boolean isOn) {
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
.putBoolean(PREF_IS_ALARM_ON, isOn)
.apply();
}
4.存储定时器状态(PollService.java)
QueryPreferences.setAlarmOn(context, isOn);
5.设备重启后启动定时器(StartupReceiver.java)
boolean isOn = QueryPreferences.isAlarmOn(context);
PollService.setServiceAlarm(context, isOn);
二、过滤前台通知消息
1.发送broadcast intent(PollService.java)
public static final String ACTION_SHOW_NOTIFICATION =
"com.bignerdranch.android.photogallery.SHOW_NOTIFICATION";
sendBroadcast(new Intent(ACTION_SHOW_NOTIFICATION));
三、创建并登记动态receiver
新建一个VisibleFragment抽象类。
1.VisibleFragment自己的receiver(VisibleFragment.java)
public abstract class VisibleFragment extends Fragment {
private static final String TAG = "VisibleFragment";
@Override
public void onStart() {
super.onStart();
IntentFilter filter = new IntentFilter(PollService.ACTION_SHOW_NOTIFICATION);
getActivity().registerReceiver(mOnShowNotification, filter);
}
@Override
public void onStop() {
super.onStop();
getActivity().unregisterReceiver(mOnShowNotification);
}
private BroadcastReceiver mOnShowNotification = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(getActivity(),
"Got a broadcast:" + intent.getAction(),
Toast.LENGTH_LONG)
.show();
}
2.设置fragment为可见(PhotoGalleryFragment.java)
public class PhotoGalleryFragment extends ~~Fragment~~ VisibleFragment {
四、使用私有权限限制broadcast
1.添加私有权限(AndroidManifest.xml)
<permission android:name="com.bignerdranch.android.photogallery.PRIVATE"
android:protectionLevel="signature" />
<uses-permission android:name="com.bignerdranch.android.photogallery.PRIVATE" />
2.发送带有权限的broadcast(PollService.java)
public static final String PERM_PRIVATE =
"com.bignerdranch.android.photogallery.PRIVATE";
sendBroadcast(new Intent(ACTION_SHOW_NOTIFICATION),PERM_PRIVATE);
3.broadcast receiver的使用权限(VisibleFragment.java)
PollService.PERM_PRIVATE, null);
五、使用有序broadcast收发数据
1.返回一个简单结果码(VisibleFragment.java)
// If we receive this, we're visible, so cancel
// the notification
Log.i(TAG, "canceling notification");
setResultCode(Activity.RESULT_CANCELED);
2.发送有序broadcast(PollService.java)
public static final String REQUEST_CODE = "REQUEST_CODE";
public static final String NOTIFICATION = "NOTIFICATION";
showBackgroundNotification(0, notification);
private void showBackgroundNotification(int requestCode, Notification notification) {
Intent i = new Intent(ACTION_SHOW_NOTIFICATION);
i.putExtra(REQUEST_CODE, requestCode);
i.putExtra(NOTIFICATION, notification);
sendOrderedBroadcast(i, PERM_PRIVATE, null, null,
Activity.RESULT_OK, null, null);
}
3.实现result receiver(NotificationReceiver.java)
新建一个NotificationReceiver类
public class NotificationReceiver extends BroadcastReceiver {
private static final String TAG = "NotificationReceiver";
@Override
public void onReceive(Context c, Intent i) {
Log.i(TAG, "received result: " + getResultCode());
if (getResultCode() != Activity.RESULT_OK) {
// A foreground activity cancelled the broadcast
return;
}
int requestCode = i.getIntExtra(PollService.REQUEST_CODE, 0);
Notification notification = (Notification)
i.getParcelableExtra(PollService.NOTIFICATION);
NotificationManagerCompat notificationManager =
NotificationManagerCompat.from(c);
notificationManager.notify(requestCode, notification);
}
}
4.登记notification receiver(AndroidManifest.xml)
<receiver android:name=".NotificationReceiver"
android:exported="false">
<intent-filter
android:priority="-999">
<action
android:name="com.bignerdranch.android.photogallery.SHOW_NOTIFICATION" />
</intent-filter>
</receiver>