BroadcastReceiver广播接收者(四)——本地广播LocalBroadcastManager以及在onReceive()中弹出Dialog

简介: MainActivity如下:package cc.cv;import android.os.Bundle;import android.support.
MainActivity如下:
package cc.cv;

import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
 * Demo描述:
 * 1 本地广播LocalBroadcast使用完整示例
 * 2 在广播的onReceive()方法中弹出Dialog
 * 
 * 本地广播的特点:
 * 1 本地广播只能在本App中传播,并且广播接收器也只能接收来自本APP发出的广播.
 *   所以在该情况下可防止其他应用获取广播中的敏感数据从而确保数据安全.
 *   
 * 2 本地广播只能使用在代码中动态注册的方式.
 *   因为静态注册主要是为了让程序在未启动的情况下也能收到广播.在发送本地广播
 *   时,我们的App肯定是已经启动了,因此也完全不需要使用静态注册.否则,这个本地
 *   广播也没什么特点了.
 * 
 * 
 * 注意事项:
 * 在广播的onReceive()方法中弹出Dialog
 * 1 给Dialog设置Type
 *   dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
 * 2 注意权限
 *   <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
 *  
 *  
 * 参考资料:
 * http://blog.csdn.net/guolin_blog
 * Thank you very much
 */
public class MainActivity extends Activity {
	private Button mButton;
	private Intent mIntent;
	private Context mContext;
	private IntentFilter mIntentFilter;
    private LocalBroadcastManager mLocalBroadcastManager;
	private LocalBroadcastReceiver mLocalBroadcastReceiver;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
	
	private void init(){
		mContext=this;
		mButton=(Button) findViewById(R.id.button);
		mButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				registerLocalBroadcastReceiver();
				sendLocalBroadcast();
			}
		});
	}
	
	
	/**
	 * 注册本地广播接收者
	 */
	private void registerLocalBroadcastReceiver(){
		mIntentFilter=new IntentFilter("test_action");
		mLocalBroadcastReceiver=new LocalBroadcastReceiver();
		mLocalBroadcastManager=LocalBroadcastManager.getInstance(mContext);
		mLocalBroadcastManager.registerReceiver(mLocalBroadcastReceiver, mIntentFilter);
	}
	
	/**
	 * 发送本地广播
	 */
	private void sendLocalBroadcast(){
		mIntent=new Intent("test_action");
		mIntent.putExtra("number", "9527");
		mLocalBroadcastManager.sendBroadcast(mIntent);
		//发送广播后取消本地广播的注册
		unRegisterLocalBroadcastReceiver();
	}
	
	/**
	 * 取消本地广播的注册
	 */
	private void unRegisterLocalBroadcastReceiver(){
		if (mLocalBroadcastManager!=null) {
			if (mLocalBroadcastReceiver!=null) {
				mLocalBroadcastManager.unregisterReceiver(mLocalBroadcastReceiver);
			}
		}
	}
	
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unRegisterLocalBroadcastReceiver();
	}

}


LocalBroadcastReceiver如下:

package cc.cv;

import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.WindowManager;

public class LocalBroadcastReceiver extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent) {
		String message=intent.getStringExtra("number");
		showDialogInBroadcastReceiver(context, message);
	}
	
	
	/**
	 * 在广播的onReceive()方法中弹出Dialog
	 * 1 给Dialog设置Type
	 *  dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
	 * 2 注意权限
	 *  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
	 */
	private void showDialogInBroadcastReceiver(Context context,String message){
		Builder builder=new Builder(context);  
        builder.setIcon(R.drawable.ic_launcher);  
        builder.setTitle("Title");  
        builder.setMessage(message);  
        builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int arg1) {
            	dialog.dismiss();
            }  
        });  
        Dialog dialog=builder.create();
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        dialog.show();  
	}

}

main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="发送本地广播" />

</RelativeLayout>


相关文章
|
4月前
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
89 12
|
4月前
EditText 的一些软键盘属性和回调
EditText 的一些软键盘属性和回调
32 0
|
Android开发
Android中下拉通知栏,Activity会走哪些生命周期?
我们就可以做一个总结:当前Activity中,下拉通知栏,是不走任何生命周期的。
238 0
|
Android开发
3种方法实现Android按钮的点击事件,建议收藏!
3种方法实现Android按钮的点击事件,建议收藏!
629 0
3种方法实现Android按钮的点击事件,建议收藏!
|
Android开发
Android--在非activity弹出Dialog对话框
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/80521795 需要在adapter类监听button点击事件弹出需要弹出一个系统级对话框,也就是这个对话框不论是在哪个活动,都可以弹出这个对话框。
3079 0
|
Android开发 容器
Android触摸事件(续)——点击长按事件
昨天写完了Android触摸事件(下)——事件的分发,写完后以为这一部分终将告一段落了。今早无意间突然想起,好像关于点击事件、长按事件这一部分并没有分析啊!!垂死病中惊坐起,粗略的看了下源码,好像没啥东西啊。
1217 0
|
Android开发 数据安全/隐私保护