Activity通过广播进行传值

来源:互联网 发布:微商怎么上淘宝找货源 编辑:程序博客网 时间:2024/05/19 01:30


今天用了一点时间,来完成这个功能,主要是实现各个Activity之间的值传递。

当然了,广播本来就是全局大喇叭,用来传值也很正常滴嘛。关于广播的一些概念,我就不阐述了。

用代码走起吧:

package com.napoleonbai.broadcast_use;import java.util.ArrayList;import java.util.List;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;/** * 自定义广播,完成各个Activity之间的传值 *  * @author NapoleonBai * */public class CustomBroadCast extends BroadcastReceiver {/** 自定义的Action */public static String CUSTOM_BROAD_CAST_ACTION = "com.napoleonbai.broadcast_user.CUSTOMBROADCAST";@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction() == CUSTOM_BROAD_CAST_ACTION) {// 如果该Activity实现了接口,那么就使用接口进行值回传if (context instanceof OnCustomBroadCastListener&& mOnCustomBroadCastListener.contains(context)) {// 将intent信息进行回传((OnCustomBroadCastListener) context).onIntentListener(intent);}}}/** 私有化构造方法,实现单例模式 */private CustomBroadCast() {}/** 自定义的广播对象 */private static CustomBroadCast mCustomBroadCast;/** 自定义的Context集合,用于注册和取消广播 */private List<Context> contextList = new ArrayList<Context>();/** 保存接口数据 */private List<OnCustomBroadCastListener> mOnCustomBroadCastListener = new ArrayList<OnCustomBroadCastListener>();/** * 实现单例模式,创建广播对象 *  * @return */public static CustomBroadCast newInstance() {if (mCustomBroadCast == null) {synchronized (CustomBroadCast.class) {if (mCustomBroadCast == null) {mCustomBroadCast = new CustomBroadCast();}}}return mCustomBroadCast;}/** * 注册广播 *  * @param action */public CustomBroadCast registerAction(Context context) {if (contextList.size() > 0 && !contextList.contains(context)|| contextList.size() <= 0) {contextList.add(context);IntentFilter filter = new IntentFilter();filter.addAction(CUSTOM_BROAD_CAST_ACTION);context.registerReceiver(mCustomBroadCast, filter);// 如果实现了接口,这里才去注册接口if (context instanceof OnCustomBroadCastListener) {registerOnCustomBroadCastListener((OnCustomBroadCastListener) context);}}return mCustomBroadCast;}/** * 注销广播 *  * @param context */public void unRegister(Context context) {if (contextList.contains(context)) {context.unregisterReceiver(mCustomBroadCast);contextList.remove(context);if (context instanceof OnCustomBroadCastListener) {mOnCustomBroadCastListener.remove(context);}}}/*** * 注册接口监听 *  * @param listener */private void registerOnCustomBroadCastListener(OnCustomBroadCastListener listener) {this.mOnCustomBroadCastListener.add(listener);}/** * 提供回传数据接口 *  * @author NapoleonBai * */public interface OnCustomBroadCastListener {public void onIntentListener(Intent intent);}}
此类就是最主要的广播类了,里面定义了一个接口,用于进行数据的传递。当然,我们要怎么使用这个类呢?

那么请看:

package com.napoleonbai.broadcast_use;import com.napoleonbai.broadcast_use.CustomBroadCast.OnCustomBroadCastListener;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.View;public class FirstActivity extends Activity implementsOnCustomBroadCastListener {private static String TAG = "FirstActivity=====>";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 使用的时候直接注册即可,传入当前上下文对象,如果想要得到回传数据,那么就实现:OnCustomBroadCastListener接口即可CustomBroadCast.newInstance().registerAction(FirstActivity.this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overrideprotected void onStop() {super.onStop();}@Overrideprotected void onDestroy() {super.onDestroy();// 注销当前界面的广播<根据自身需要注销>CustomBroadCast.newInstance().unRegister(FirstActivity.this);}public void onAction(View v) {if (v.getId() == R.id.button1) {SecondActivity.startActivity(FirstActivity.this);} else {Intent intent = new Intent();intent.putExtra("key", "FirstActivity");intent.putExtra("value", "value-First");intent.setAction(CustomBroadCast.CUSTOM_BROAD_CAST_ACTION);FirstActivity.this.sendBroadcast(intent);}}@Overridepublic void onIntentListener(Intent intent) {// 接收广播传送的数据Log.d("data", TAG + intent.getStringExtra("key"));Log.d("data", TAG + intent.getStringExtra("value"));}}
这个Activity主要用于测试,当然了,小编用于测试还有其他两个activity,因为都是一样滴,就不贴出来了。

关于广播的注册和注销,以及传值,此Activity已经详细阐明,使用简单。不过,注销还是需要仔细考虑位置滴,按照所需功能来完成吧。

如果有不同见解或者更好的方式,请告诉小编。一起学习学习。

0 0
原创粉丝点击