您的位置:首页 > 移动开发 > Android开发

android BrocadcastReceiver

2015-09-18 21:08 639 查看
广播注册有两种方式:

1,静态注册

<receiver android:name="com.text_android_dynamic.Receiver">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>


2,动态注册

filter = new IntentFilter();
		filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
		receiver = new Receiver();
		registerReceiver(receiver, filter);


注意的是动态注册需要关闭广播

protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		unregisterReceiver(receiver);
	}


实现广播首先先定义一个类 继承 BroadCaseReceive,实现onReceive方法 所有的操作都在此方法中进行

注意的是这个方法的生命周期很短,所以所有的耗时的操作都不要在这个方法中进行。

public class Receiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		
	}

}


广播分为两种:

1,标准广播

发送广播为标准意义的 就像是新闻联播,所有的接受者都可以收到

(这个是静态注册)

首先是一个继承BrocadcastReceiver的类,在Manifast里面注册,在Activity里面启动。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		//通过intent获取传递的参数
		System.out.println("BroadcastReceiver============"+intent.getStringExtra("data"));
	}

}
不要忘记注册

<receiver 
            android:name="com.brocastreceiver.MyReceiver"></receiver>


package com.brocastreceiver;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.Main_SendBtn).setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		
		switch (v.getId()) {
		case R.id.Main_SendBtn:
			Intent intent = new Intent(MainActivity.this,MyReceiver.class);
			//设置传递参数
			intent.putExtra("data", "sssss");
			sendBroadcast(intent);
			break;

		}
		
	}
 
}
(动态注册)

package com.brocastreceiver;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener{
	private MyReceiver receiver = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.Main_SendBtn).setOnClickListener(this);
		findViewById(R.id.Main_RegisBtn).setOnClickListener(this);
		findViewById(R.id.Main_UnBtn).setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		
		switch (v.getId()) {
		case R.id.Main_SendBtn:
			Intent i = new Intent(receiver.ACTION);
			i.putExtra("data", "data");
			sendBroadcast(i);
			break;
		case R.id.Main_RegisBtn:
			if (receiver == null) {
				receiver = new MyReceiver();
				registerReceiver(receiver, new IntentFilter(receiver.ACTION ));
			}	
			break;
		case R.id.Main_UnBtn:
			if (receiver != null) {
				unregisterReceiver(receiver);
				receiver = null;
			}
			
			break;
		}
		
	}
 
}


package com.brocastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver{
	public static final String ACTION = "com.brocastreceiver.intent.action.MyReceiver";

	@Override
	public void onReceive(Context context, Intent intent) {
		//通过intent获取传递的参数
		System.out.println("BroadcastReceiver============"+intent.getStringExtra("data"));
	}

}


2,有序广播

发送广播为有序的,就像是中央文件,需要一级一级的向下传达

代码与上一个一样,改一下Manifest里面的优先级

<receiver android:name="com.text_android_broadcase.Receiver" >
            <intent-filter android:priority="1000">
                <action android:name="com.broadcasereceiver.MyBoradReceiver" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.text_android_broadcase.Receiver1" >
            <intent-filter android:priority="100">
                <action android:name="com.broadcasereceiver.MyBoradReceiver" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.text_android_broadcase.Receiver2" >
            <intent-filter android:priority="500">
                <action android:name="com.broadcasereceiver.MyBoradReceiver" />
            </intent-filter>
        </receiver>
打印结果

一个强制下线的Demo

protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login);
		account = (EditText) findViewById(R.id.account);
		pass = (EditText) findViewById(R.id.password);
		login = (Button) findViewById(R.id.login);
		login.setOnClickListener(new OnClickListener() {
			String acc,pa;
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				acc = account.getText().toString().trim();
				pa = pass.getText().toString().trim();
				if (acc.equals("123")&&pa.equals("123")) {
					startActivity(new Intent(LoginActivity.this,MainActivity.class));
					finish();
				}
			}
		});
	
		
	}
一个Login的activity 点击登入进入另一个activity
case R.id.btn_ac:
			Intent intent = new Intent("com.broadcasereceiver.MyBoradReceiver");
			sendBroadcast(intent);
			break;


另一个activity只有一个广播发送

public class Receiver extends BroadcastReceiver {

	@Override
	public void onReceive(final Context context, Intent intent) {
		
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle("Waring");

		builder.setMessage("login again");
		builder.setCancelable(false);//不可以控制消除dialog
		builder.setPositiveButton("OK",new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
			ActivityCollector.finishAll();
			Intent intent = new Intent(context,LoginActivity.class);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//优先启动这个activity
			context.startActivity(intent);
			}
		});
		AlertDialog dialog = builder.create();
		dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//全局性质的提示框
		dialog.show();
	}
定义一个广播,在onReceive方法中实现Dialog 这样 强制下线需要统一管理activity

public class ActivityCollector {

	public static List<Activity> activities = new ArrayList<Activity>();

	public static void addActivity(Activity activity) {
		activities.add(activity);
	}

	public static void removeActivity(Activity activity) {
		activities.remove(activity);
	}

	public static void finishAll() {
		for (Activity activity : activities) {
			activity.finish();
		}
	}
}


public class BaseActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		ActivityCollector.addActivity(this);
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		ActivityCollector.removeActivity(this);
	}
}


<uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.text_android_broadcase.LoginActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.text_android_static.static_Receiver" >
        </activity>
        <activity android:name="com.text_android_dynamic.Dynamic_Receiver" >
        </activity>
        <activity android:name="com.text_android_broadcase.MainActivity" >
        </activity>

        
        <receiver android:name="com.text_android_broadcase.Receiver" >
            <intent-filter  >
                <action android:name="com.broadcasereceiver.MyBoradReceiver" />
            </intent-filter>
        </receiver>
        
    </application>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: