android BrocadcastReceiver

来源:互联网 发布:iis7怎么执行php 编辑:程序博客网 时间:2024/04/25 05:07

广播注册有两种方式:

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 stubsuper.onDestroy();unregisterReceiver(receiver);}

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

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

public class Receiver extends BroadcastReceiver{@Overridepublic 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{@Overridepublic 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{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.Main_SendBtn).setOnClickListener(this);}@Overridepublic 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;@Overrideprotected 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);}@Overridepublic 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";@Overridepublic 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 stubsuper.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;@Overridepublic void onClick(View v) {// TODO Auto-generated method stubacc = 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 {@Overridepublic void onReceive(final Context context, Intent intent) {AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle("Waring");builder.setMessage("login again");builder.setCancelable(false);//不可以控制消除dialogbuilder.setPositiveButton("OK",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubActivityCollector.finishAll();Intent intent = new Intent(context,LoginActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//优先启动这个activitycontext.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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);ActivityCollector.addActivity(this);}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.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>




0 0
原创粉丝点击