android广播查看,Android:广播的使用实例

说明

首次发布

2019年02月15日

最近更新

2019年02月15日

广播的生命周期

BroadcastReceiver生命周期只有十秒左右,如果在onReceive()内做超过十秒的事情,就会报错。所以广播中不要执行耗时操作,可以考虑启动一个Service来完成操作。

广播的分类

根据注册方式,可以分为静态广播和动态广播。

静态广播

需要在AndroidManifest.xml文件中配置,具有常驻性广播,无论程序启动与否,广播依然存在的特点。比如:我们可以接收开机的广播,当收到这条广播时就可以在 onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。

由于谷歌从Android 8开始,对静态广播做了限制,具体请查看。需要在发送广播时,给intent添加setComponent(),ComponentName(@NonNull String pkg, @NonNull String cls)有两个参数:参数一为包名,参数二为接收器receiver在包内的路径。具体请参考代码。

动态广播

代码中动态指定广播地址并注册,具有非常驻型,广播会跟随程序的生命周期的结束而结束的特点。需要特别注意的是:需要在onCreate()中进行注册,在onDestroy()中进行注销。

AndroidManifest.xml

....

BroadcastActivity

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.v4.content.LocalBroadcastManager;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

import com.tencent.testand.R;

import com.tencent.testand.other.DynamicBroadcastReceiver;

public class BroadcastActivity extends Activity implements View.OnClickListener {

public static final String DYNAMIC_BROADCAST_ACTION = "com.tencent.testand.DynamicBroadcast";

public static final String STATIC_BROADCAST_ACTION = "com.tencent.testand.StaticBroadcast";

public static final String LOCAL_BROADCAST = "my_local_broadcast";

private Button mSendDynamicBroadcastButton;

private DynamicBroadcastReceiver mReceiver;

private Button mSendStaticBroadcastButton;

private Button mSendLocalBroadcastButton;

private LocalReceiver mLocalReceiver;

private LocalBroadcastManager mLocalBroadcastManager;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_braodcast);

findViews();

registerBroadcast();

registerLocalBroadcast();

}

/**

* 注册本地广播

*/

private void registerLocalBroadcast() {

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(LOCAL_BROADCAST);

mLocalReceiver = new LocalReceiver();

mLocalBroadcastManager.registerReceiver(mLocalReceiver, intentFilter);

}

private void findViews() {

mSendDynamicBroadcastButton = findViewById(R.id.send_dynamic_broadcast_button);

mSendDynamicBroadcastButton.setOnClickListener(this);

mSendStaticBroadcastButton = findViewById(R.id.send_static_broadcast_button);

mSendStaticBroadcastButton.setOnClickListener(this);

mSendLocalBroadcastButton = findViewById(R.id.send_local_broadcast_button);

mSendLocalBroadcastButton.setOnClickListener(this);

}

@Override

protected void onDestroy() {

super.onDestroy();

// 注销

unregisterReceiver(mReceiver);

// 注销本地广播

mLocalBroadcastManager.unregisterReceiver(mLocalReceiver);

}

/**

* 注册广播

*/

private void registerBroadcast() {

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(DYNAMIC_BROADCAST_ACTION);

mReceiver = new DynamicBroadcastReceiver();

registerReceiver(mReceiver, intentFilter);

}

/**

* 内部类:本地广播的接收者

*/

public class LocalReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Toast.makeText(context, "received local broadcast",

Toast.LENGTH_SHORT).show();

}

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.send_dynamic_broadcast_button: {

// 注意:intent里面必须要写action的名字

Intent intent = new Intent(DYNAMIC_BROADCAST_ACTION);

intent.putExtra("key", "I'm dynamic broadcast");

sendBroadcast(intent);

break;

}

case R.id.send_static_broadcast_button: {

// 注意:intent里面必须要写action的名字

Intent intent = new Intent(STATIC_BROADCAST_ACTION);

intent.setComponent(new ComponentName(getPackageName(), getPackageName() + ".other.DynamicBroadcastReceiver"));

intent.putExtra("key", "I'm static broadcast");

sendBroadcast(intent);

break;

}

case R.id.send_local_broadcast_button: {

// 注意:intent里面必须要写action的名字

Intent intent = new Intent(LOCAL_BROADCAST);

intent.putExtra("key", "I'm local broadcast");

// 注意:这里一定要用mLocalBroadcastManager,这也是本地广播与其他广播的区别

mLocalBroadcastManager.sendBroadcast(intent);

break;

}

}

}

}

DynamicBroadcastReceiver

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.text.TextUtils;

import android.util.Log;

import android.widget.Toast;

import com.tencent.testand.activity.DynamicBroadcastActivity;

public class DynamicBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

// 根据action来区分广播

if (TextUtils.equals(intent.getAction(), DynamicBroadcastActivity.DYNAMIC_BROADCAST_ACTION)

|| TextUtils.equals(intent.getAction(), DynamicBroadcastActivity.STATIC_BROADCAST_ACTION))

{

Toast.makeText(context, intent.getStringExtra("key"), Toast.LENGTH_LONG).show();

Log.i(getClass().getSimpleName(), "onReceive: ");

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值