Android Studio 单刷《第一行代码(7)

打开、关闭飞行模式

电量低

内存不足

网络变化

动态注册

下面是监听网络变化的例子,新建一个 BroadcastTest 项目。

在 MainActivity 中定义一个内部类继承自 BroadcastingReceiver,代码如下:

class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show(); } }

在 onCreate() 方法中注册,代码如下:

private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); }

在 onDestroy() 方法中取消注册,代码如下:

@Override protected void onDestroy(){ super.onDestroy(); unregisterReceiver(networkChangeReceiver); }

OK,运行一下,会发现程序启动时会弹出一个提示;按 Home 回到主界面,并尝试开关网络,会发现有提示弹出。

静态注册

下面是监听系统启动的例子。

在 MainActivity 中新建一个 public 类继承自 BroadcastingReceiver,代码如下:

public class BootCompleteReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "Boot complete", Toast.LENGTH_SHORT).show(); } }

在 AndroidManifest.xml 中静态注册,增加 receiver 代码如下:

<receiver android:name=".MainActivity$BootCompleteReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>

监听系统开机广播需要权限,在 AndroidManifest.xml 中添加权限声明,代码如下:

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

OK,运行程序,到设置 → 应用程序里找到我们的 Broadcast,点击打开会看到程序拥有了开机启动的权限。重启机器或模拟器就可以收到开机广播啦。

自定义广播

下面是在程序中发送自定义广播并接收的例子。

在 MainActivity 中新建一个 MyBroadcastReceiver,代码如下:

public static class MyBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); } }

在 AndroidManifest.xml 中注册,代码如下:

<receiver android:name=".MainActivity$MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/> </intent-filter> </receiver>

让 MyBroadcastReceiver 接收一条 com.example.broadcasttest.MY_BROADCAST 的广播。

给 MainActivity 增加一个按钮,并在 onCreate() 方法中添加点击事件,代码如下:

Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent); } });

OK,运行一下,点击按钮,就会收到我们发出的广播。

本地广播 LocalBroadcast

前面用到的都是全局广播,可以被其他任何程序接收到,会引起一些安全性问题。下面是一个发送接收本地广播的例子。

定义一个 LocalReceiver ,代码如下:

public static class LocalReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show(); } }

使用 LocalBroadcastManager 来注册接收器、发送广播,代码如下:

private IntentFilter intentFilter; private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); localBroadcastManager = localBroadcastManager.getInstance(this); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); } }); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter); }

别忘了取消注册,代码如下:

@Override protected void onDestroy(){ super.onDestroy(); localBroadcastManager.unregisterReceiver(localReceiver); }

OK,运行一下,点击按钮,就会接收到我们发出的本地广播啦。

PS:本地广播无法通过静态注册的方式接收。

Android Studio 的详细介绍请点这里
Android Studio 的下载地址请点这里 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b06c7fbf13886970330931cac9f6b4cb.html