接受广播:
1:动态注册广播监听网络状态:
public class NetWorkReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = manager.getActiveNetworkInfo(); if (info != null && info.isAvailable()){ Toast.makeText(context, "当前网络环境可用", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context, "当前网络环境不可用", Toast.LENGTH_SHORT).show(); } } }
创建一个类继承BroadcastReceiver、实现onReceive方法。
接着注册广播,
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); receiver = new NetWorkReceiver(); filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); registerReceiver(receiver, filter); }
动态注册即用代码注册。创建broadcast实例再创建IntentFilter,设置filter的action为android.net.CONNECTIVITY_CHANGE(监听网络用的)。需要访问网络的权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
最后注册广播。调用registerReceiver方法。
最后记得activity销毁的时候解除注册。
protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); }
2:静态注册广播开机启动
创建一个类继承BroadcastReceiver。
public class Broadcast_boot extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "开机启动", Toast.LENGTH_SHORT).show(); } }静态注册即在清单文件注册。
<receiver android:name=".Broadcast_boot"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>需要开机启动权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
发送广播:
1:发送无序广播。
public class Broadcast_unordered extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "这是一条无序广播", Toast.LENGTH_SHORT).show(); } }
创建一个类继承BroadcastReceiver。
在清单文件注册。
<receiver android:name=".Broadcast_unordered"> <intent-filter> <action android:name="com.example.seven.sendbroadcast.Broadcast_unordered" /> </intent-filter> </receiver>注意action中要填包名+类名。
之后发送广播
Intent intent = new Intent("com.example.seven.sendbroadcast.Broadcast_unordered"); sendBroadcast(intent);
2:有序广播 (和无序广播的区别就是:有序广播可拦截,数据可修改。并且可设置优先级)
public class Broadcast_order extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "这是一条有序广播", Toast.LENGTH_SHORT).show(); abortBroadcast(); } }
创建一个类继承BroadcastReceiver。
在清单文件注册。
<receiver android:name=".Broadcast_order"> <intent-filter android:priority="100"> <action android:name="com.example.seven.sendbroadcast.Broadcast_order" /> </intent-filter> </receiver>
之后发送广播
Intent intent1 = new Intent("com.example.seven.sendbroadcast.Broadcast_order"); sendOrderedBroadcast(intent1, null);这时发送广播用sendOrderedBroadcast。
本地广播:动态注册接受
public class Broadcast_local extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "这是一条本地广播", Toast.LENGTH_SHORT).show(); } }
创建一个类继承BroadcastReceiver。
然后注册。
manager_local = LocalBroadcastManager.getInstance(this); receiver_local = new Broadcast_local(); filter_local = new IntentFilter(); filter_local.addAction("com.example.seven.sendbroadcast.Broadcast_local"); manager_local.registerReceiver(receiver_local, filter_local);注册本地广播需要获取LocalBroadcastManager。注册广播时调用manager的registerReceiver方法。
注册完发送广播
Intent intent2 = new Intent("com.example.seven.sendbroadcast.Broadcast_local"); manager_local.sendBroadcast(intent2);这里调用manager的sendBroadcast方法来发送。
最后需要在activity销毁时解除广播。
@Override protected void onDestroy() { super.onDestroy(); manager_local.unregisterReceiver(receiver_local); }
范例:实现QQ的强制下线功能:
首先做一个登陆页面。账号、密码的输入框,勾选记住密码用户名,登陆按钮。
点击登陆成功后跳转到另一个页面,该页面有一个按钮,点击时会发送一条广播将activity全部销毁再跳转到登陆页面。
强制下线即销毁掉所有activity页面再跳转到登陆页面。
所以需要创建一个类ActivityCollector来定义一个集合添加activity及删除activity。
public class ActivityCollector { private static List<Activity> list = new ArrayList<Activity>(); public static void addActivity(Activity activity){ if (!list.contains(activity)) { list.add(activity); } } public static void removeActivity(Activity activity){ list.remove(activity); } public static void finishAll(){ for (Activity obj : list){ if (!obj.isFinishing()){ obj.finish(); } } } }
定义一个基类onCreate时添加进集合、onDestroy时从集合中删除。
public class BaseActivity extends Activity { public <E extends View>E findViewByIds(int id){ return (E)findViewById(id); } @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); } }
第二个页面按钮点击发送广播
public void click(View view){ Intent intent = new Intent("com.example.seven.qq_forceoffline.Broadcast_forceOffline"); sendBroadcast(intent); }
广播接收
public class Broadcast_forceOffline extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("警告"); builder.setMessage("您已被强迫下线!请重新登陆!"); builder.setCancelable(false); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCollector.finishAll(); Intent intent = new Intent(context, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }); AlertDialog dialog = builder.create(); dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); dialog.show(); } }定义一个AlertDialog对话框提示用户。设置为不可按返回按键。当点击确定按钮时销毁所有activity再跳转到登陆页面。
注意跳转时需要intent来addFlags定义一个activity栈(因为在广播中)。
注意要设置dialog的类型。dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)。
最后显示对话框。
需要加权限。该权限是系统级别的,弹出对话框后按主页键还是不会消失。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
本文详细介绍了Android中的广播机制,包括动态注册监听网络状态、静态注册实现开机启动、发送无序与有序广播的方法及其区别、本地广播的应用等。此外,还通过实例展示了如何实现类似QQ的强制下线功能。
919

被折叠的 条评论
为什么被折叠?



