该文主要讲解Android四大组件之一:BroadcastReceiver的初步使用,和其他三大组件一样,都需要在AndroidManifest.xml文件中注册(当然,广播注册的另一种方式是在代码中)。
实现效果图:
源代码:
布局文件:
MainActivity:
package com.android_broadcastreceiver;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
/**
* 三个广播在manifest.xml文件中的Action设置的都是myaction,所以发送广播的时候,这三个都可以收到广播
* 。
*/
intent.setAction("myaction");
intent.putExtra("name", "梅西!!!");
sendBroadcast(intent);
}
});
}
}
MyBroadcastReceiver:
package com.android_broadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getExtras().getString("name");
Toast.makeText(context, "广播1已发送..."+name, Toast.LENGTH_SHORT).show();
}
}
MyBroadcastReceiver2:
package com.android_broadcastreceiver;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
/**
* 以通知的形式展示广播
*
*/
public class MyBroadcastReceiver2 extends BroadcastReceiver {
private NotificationManager manager;
@Override
public void onReceive(Context context, Intent intent) {
manager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
String name = intent.getExtras().getString("name");
NotificationCompat.Builder builder = new NotificationCompat.Builder(
context);
builder.setTicker("广播2来了!!!");
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("电量不足!!!");
builder.setContentText("电量还剩10%"+"快通知:"+name);
manager.notify(1001, builder.build());
}
}
MyBroadcastReceiver3:
package com.android_broadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getExtras().getString("name");
Toast.makeText(context, "广播3已发送..."+name, Toast.LENGTH_SHORT).show();
}
}
AndroidManifest.xml:
比较简单,需要源码的读者可以到我的资源中下载。
Android 8.0为了优化系统性能,对隐式(注册)广播(即在AndroidManifest.xml中注册的广播)做了一定的限制,即以上的一般情况下无法正常收到发送的广播,针对这一限制,有两种方案可供解决参考:
方法一:显式(注册)广播【推荐】(会跟随Activity等销毁而销毁):
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("myaction");
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
registerReceiver(receiver, intentFilter);
方法二:隐式广播发送时添加包名:
Intent intent = new Intent();
intent.setAction("myaction");
intent.putExtra("name", "梅西!!!");
//添加目标应用的包名
intent.setPackage(getPackageName());
sendBroadcast(intent);