android Broadcast學習 實例

轉自:http://www.cnblogs.com/snowdrop/articles/1906709.html

寫的比較淺顯偏實用,主要是代碼實例

===========================================================================================

其實所謂的靜態註冊,動態註冊,是指接收廣播的時候,是靜態註冊接收還是動態註冊接收,發送的時候不分靜態,動態

以發送intent爲例,

一共分4種情況,以每次註冊兩個Broadcast爲例:

情況一,註冊2個靜態Broadcast

如果是靜態註冊的,接收的一定是某一個類繼承BroadcastReceiver

2個java文件如下:

BroadcastActivity.java
複製代碼
代碼
package com.broad.test1;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;

//2個靜態註冊
publicclass BroadcastActivity extends Activity {
/** Called when the activity is first created. */
private Button button01;
private Button button02;
privatestaticfinal String TAG ="BroadcastActivity";
privatestaticfinal String INTENAL_ACTION_1 ="su1.bluetooth.true";
privatestaticfinal String INTENAL_ACTION_2 ="su1.bluetooth.false";

@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button01
= (Button) findViewById(R.id.button01);
button02
= (Button) findViewById(R.id.button02);
button01.setOnClickListener(mybtnListener);
button02.setOnClickListener(mybtnListener);
}

private OnClickListener mybtnListener =new OnClickListener() {

@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
if (v.getId() == (R.id.button01)) {
Intent intent
=new Intent(INTENAL_ACTION_1);
// 也可以用mContext.sendBroadcast(intent),mContext.sendBroadcast可以在構造函數裏面初始化,
// 有內部類的時候必須用???
sendBroadcast(intent);
}
elseif (v.getId() == (R.id.button02)) {
Intent intent
=new Intent(INTENAL_ACTION_2);
sendBroadcast(intent);
}
else {
Log.v(TAG,
"not true not false");
}
}

};

}
複製代碼

BroadcastRecTest.java
複製代碼
代碼
package com.broad.test1;

import android.content.BroadcastReceiver;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
publicclass BroadcastRecTest extends BroadcastReceiver {
privatestaticfinal String TAG="BroadcastActivity";
privatestaticfinal String INTENAL_ACTION_1="su1.bluetooth.true";
privatestaticfinal String INTENAL_ACTION_2="su1.bluetooth.false";
@Override
publicvoid onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(action.equals(INTENAL_ACTION_1)){
Log.d(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>su1.bluetooth.true");
}
elseif(action.equals(INTENAL_ACTION_2)){
Log.d(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>su1.bluetooth.false");
}
else{
Log.d(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>other type intent");
}

}
}
複製代碼

main.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height
="wrap_content"
android:text
="@string/hello"
/>
<Button
android:id="@+id/button01"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="靜態接收廣播true"/>
<Button
android:id="@+id/button02"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="靜態接收廣播false"/>
</LinearLayout>
複製代碼

AndroidManifest.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package
="com.broad.test1"
android:versionCode
="1"
android:versionName
="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadcastActivity"
android:label
="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name="BroadcastRecTest">
<intent-filter>
<action android:name="su1.bluetooth.true"/>
<action android:name="su1.bluetooth.false"/>
</intent-filter>
</receiver>

</application>
<uses-sdk android:minSdkVersion="8"/>
</manifest>
複製代碼

運行結果:

注意,靜態註冊的broadcast運行有點慢:

情況2,一個靜態,一個動態註冊Broadcast

BroadcastActivity.java
複製代碼
代碼
package com.broad.test1;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;
//1個動態,1個靜態註冊
publicclass BroadcastActivity extends Activity {
/** Called when the activity is first created. */
private Button button01;
private Button button02;
privatestaticfinal String TAG="BroadcastActivity";
privatestaticfinal String INTENAL_ACTION_1="su2.bluetooth.true";
privatestaticfinal String INTENAL_ACTION_2="su2.bluetooth.false";
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button01
=(Button)findViewById(R.id.button01);
button02
=(Button)findViewById(R.id.button02);
button01.setOnClickListener(mybtnListener);
button02.setOnClickListener(mybtnListener);
}
private OnClickListener mybtnListener=new OnClickListener(){

@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
if(v.getId()==(R.id.button01)){
Intent intent
=new Intent(INTENAL_ACTION_1);
sendBroadcast(intent);
}
elseif(v.getId()==(R.id.button02)){
Intent intent
=new Intent(INTENAL_ACTION_2);
sendBroadcast(intent);
}
else{
Log.v(TAG,
"not true not false");
}
}

};


// 接收動態註冊廣播的BroadcastReceiver
private BroadcastReceiver bcrIntenal2 =new BroadcastReceiver() {
@Override
publicvoid onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//如果有多個動態註冊的廣播,要用if(action.equals()){}else if(action.equals()){}來判斷是哪個
//String action = intent.getAction();
//這裏只有一個,不用判斷了。
Log.v(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su2.bluetooth.false");
}
};
//在onStart中動態註冊廣播,當然也可以在onCreate裏面註冊
@Override
protectedvoid onStart() {
// TODO Auto-generated method stub
super.onStart();
//動態註冊
IntentFilter intentFilter=new IntentFilter(INTENAL_ACTION_2);
//也可以用這種方法動態註冊多個,說明我可以”接收“這麼多的動態廣播。
/* IntentFilter intentFilter= new IntentFilter();
intentFilter.addAction("action1");
intentFilter.addAction("action2");
*/
registerReceiver(bcrIntenal2,intentFilter);
}

//在onStop中取消註冊廣播,如果在onCreate裏面註冊,那麼在onDestroy裏面取消註冊。
@Override
protectedvoid onStop() {
// TODO Auto-generated method stub
super.onStop();
unregisterReceiver(bcrIntenal2);
}

}
複製代碼
BroadcastRecTest.java
複製代碼
代碼
package com.broad.test1;

import android.content.BroadcastReceiver;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
publicclass BroadcastRecTest extends BroadcastReceiver {
privatestaticfinal String TAG="BroadcastActivity";
privatestaticfinal String INTENAL_ACTION_1="su2.bluetooth.true";
@Override
publicvoid onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(action.equals(INTENAL_ACTION_1)){
Log.d(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>su.bluetooth.true");
}
else{
Log.d(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>other type intent--jingtai");
}

}
}
複製代碼

main.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height
="wrap_content"
android:text
="@string/hello"
/>
<Button
android:id="@+id/button01"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="靜態接收廣播true"/>
<Button
android:id="@+id/button02"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="動態接收廣播false"/>
</LinearLayout>
複製代碼

AndroidManifest.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package
="com.broad.test1"
android:versionCode
="1"
android:versionName
="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadcastActivity"
android:label
="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name="BroadcastRecTest">
<intent-filter>
<action android:name="su2.bluetooth.true"/>
</intent-filter>
</receiver>

</application>
<uses-sdk android:minSdkVersion="8"/>
</manifest>
複製代碼

true是靜態註冊的,在Android.xml中註冊的,false是動態註冊的,在java代碼中註冊的

運行結果:

情況三、兩個都是動態註冊的,在同一個Activity裏面既發送,又接收,(當然也可以在不同的java中,一個發送,另一個java接收,哪怕是不同的包)

動態註冊不需要一個類繼承BroadcastReceiver這個類了,直接new一個對象即可

複製代碼
代碼
package com.broad.test1;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;

//兩個動態註冊
publicclass BroadcastActivity extends Activity {
/** Called when the activity is first created. */
private Button button01;
private Button button02;
privatestaticfinal String TAG="BroadcastActivity";
privatestaticfinal String INTENAL_ACTION_1="su3.bluetooth.true";
privatestaticfinal String INTENAL_ACTION_2="su3.bluetooth.false";
// private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button01
=(Button)findViewById(R.id.button01);
button02
=(Button)findViewById(R.id.button02);
button01.setOnClickListener(mybtnListener);
button02.setOnClickListener(mybtnListener);
}
private OnClickListener mybtnListener=new OnClickListener(){

@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
if(v.getId()==(R.id.button01)){
Intent intent
=new Intent(INTENAL_ACTION_1);
sendBroadcast(intent);
}
elseif(v.getId()==(R.id.button02)){
Intent intent
=new Intent(INTENAL_ACTION_2);
sendBroadcast(intent);
}
else{
Log.v(TAG,
"not true not false");
}
}

};

// 接收動態註冊廣播的BroadcastReceiver
private BroadcastReceiver bcrIntenal2 =new BroadcastReceiver() {
@Override
publicvoid onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//如果有多個動態註冊的廣播,要用if(action.equals()){}else if(action.equals()){}來判斷是哪個
String action = intent.getAction();
if(action.equals(INTENAL_ACTION_1)){
Log.v(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su3.bluetooth.true");
}
elseif(action.equals(INTENAL_ACTION_2)){
Log.v(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su3.bluetooth.false");
}

}
};
//在onStart中動態註冊廣播,當然也可以在onCreate裏面註冊
@Override
protectedvoid onStart() {
// TODO Auto-generated method stub
super.onStart();
//動態註冊兩個
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(INTENAL_ACTION_1);
intentFilter.addAction(INTENAL_ACTION_2);
registerReceiver(bcrIntenal2,intentFilter);
}

//在onStop中取消註冊廣播,如果在onCreate裏面註冊,那麼在onDestroy裏面取消註冊。
@Override
protectedvoid onStop() {
// TODO Auto-generated method stub
super.onStop();
unregisterReceiver(bcrIntenal2);
}

}
複製代碼

main.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height
="wrap_content"
android:text
="@string/hello"
/>
<Button
android:id="@+id/button01"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="動態接收廣播true"/>
<Button
android:id="@+id/button02"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="動態接收廣播false"/>
</LinearLayout>
複製代碼

AndroidManifest.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package
="com.broad.test1"
android:versionCode
="1"
android:versionName
="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadcastActivity"
android:label
="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="8"/>
</manifest>
複製代碼

運行結果:

情況4,sendBroadcast的時候加權限,以2個都動態註冊爲例

複製代碼
代碼
package com.broad.test1;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;

//兩個動態註冊,sendBroadcast的時候加權限
publicclass BroadcastActivity extends Activity {
/** Called when the activity is first created. */
private Button button01;
private Button button02;
privatestaticfinal String TAG="BroadcastActivity";
privatestaticfinal String INTENAL_ACTION_1="su4.bluetooth.true";
privatestaticfinal String INTENAL_ACTION_2="su4.bluetooth.false";
privatestaticfinal String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button01
=(Button)findViewById(R.id.button01);
button02
=(Button)findViewById(R.id.button02);
button01.setOnClickListener(mybtnListener);
button02.setOnClickListener(mybtnListener);
}
private OnClickListener mybtnListener=new OnClickListener(){

@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
if(v.getId()==(R.id.button01)){
Intent intent
=new Intent(INTENAL_ACTION_1);
sendBroadcast(intent,BLUETOOTH_PERM);
}
elseif(v.getId()==(R.id.button02)){
Intent intent
=new Intent(INTENAL_ACTION_2);
sendBroadcast(intent,BLUETOOTH_PERM);
}
else{
Log.v(TAG,
"not true not false");
}
}

};

// 接收動態註冊廣播的BroadcastReceiver
private BroadcastReceiver bcrIntenal2 =new BroadcastReceiver() {
@Override
publicvoid onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//如果有多個動態註冊的廣播,要用if(action.equals()){}else if(action.equals()){}來判斷是哪個
String action = intent.getAction();
if(action.equals(INTENAL_ACTION_1)){
Log.v(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su4.bluetooth.true");
}
elseif(action.equals(INTENAL_ACTION_2)){
Log.v(TAG,
"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su4.bluetooth.false");
}

}
};
//在onStart中動態註冊廣播,當然也可以在onCreate裏面註冊
@Override
protectedvoid onStart() {
// TODO Auto-generated method stub
super.onStart();
//動態註冊兩個,說明我可以”接收“2個這樣Action的動態廣播
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(INTENAL_ACTION_1);
intentFilter.addAction(INTENAL_ACTION_2);
registerReceiver(bcrIntenal2,intentFilter);
}

//在onStop中取消註冊廣播,如果在onCreate裏面註冊,那麼在onDestroy裏面取消註冊。
@Override
protectedvoid onStop() {
// TODO Auto-generated method stub
super.onStop();
unregisterReceiver(bcrIntenal2);
}

}
複製代碼

發送的時候加了藍牙權限,

若在使用sendBroadcast()的方法是指定了接收權限,則只有接收方的包內--在AndroidManifest.xml中用<uses- permission>標籤聲明瞭擁有此權限的BroascastReceiver纔會有可能接收到發送來的Broadcast。

同樣,若在註冊BroadcastReceiver時指定了可接收的Broadcast的權限,則只有在接收方的包內的AndroidManifest.xml中 用<uses-permission>標籤聲明瞭,擁有此權限的Context對象所發送的Broadcast才能被這個 BroadcastReceiver所接收。

main.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height
="wrap_content"
android:text
="@string/hello"
/>
<Button
android:id="@+id/button01"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="動態接收廣播true"/>
<Button
android:id="@+id/button02"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="動態接收廣播false"/>
</LinearLayout>
複製代碼

AndroidManifest.xml

複製代碼
代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package
="com.broad.test1"
android:versionCode
="1"
android:versionName
="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadcastActivity"
android:label
="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="8"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
</manifest>
複製代碼

注意上面加的藍牙permission權限

運行結果:

 

 兩個Application間,發送廣播,(以靜態爲例)

 發送端:

複製代碼
package com.sendbroadcast.test1;

import android.app.Activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
//import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.util.Log;

public class SenderTest1Activity extends Activity {
    /** Called when the activity is first created. */
    private Button btn1;
    private static String TAG = "SenderTest1Activity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn1 = (Button) findViewById(R.id.btn1);
        btn1.setText("susuSendBroadcast");
        btn1.setOnClickListener(mylistener1);
        Log.v(TAG, "onCreate........");
    }

    OnClickListener mylistener1 = new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.v(TAG, "@@@@@onclicksendbroadcast");
            if (v.getId() == btn1.getId()) {
                Log.v(TAG, "onclicksendbroadcast");
                Intent myIntent = new Intent();
                myIntent.setAction("su.broadcast.send");
                sendBroadcast(myIntent);
            }

        }

    };
}
複製代碼

 

 

 


接收端:

 另一個application

1、Activity

複製代碼
package com.broadcast.receiver.test1;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class BroadcastReceiverTest1Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
複製代碼

2、BroadcastReceiver

複製代碼
package com.broadcast.receiver.test1;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyIntentReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        // TODO Auto-generated method stub
         String action =intent.getAction();
         if(action.equals("su.broadcast.send")){
             Log.v("MyIntentReceiver", "#####shoudao");
            }
    }

}
複製代碼

 

3、AndroidManifest.xml

複製代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.broadcast.receiver.test1"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".BroadcastReceiverTest1Activity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
       
        </activity>

        <receiver
            android:name=".MyIntentReceiver"
            android:label="wodeReceiver" >
            <intent-filter>
                <action android:name="su.broadcast.send" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
複製代碼

運行Application1,點擊button,Application2廣播接收端會收到這個廣播,打印log信息(但不會顯示BroadcastReceiverTest1Activity的界面),還是顯示SenderTest1Activity的界面,

Log信息如下:

01-30 05:14:01.146: V/SenderTest1Activity(769): onCreate........
01-30 05:14:01.766: I/ActivityManager(90): Displayed com.sendbroadcast.test1/.SenderTest1Activity: +996ms
01-30 05:14:02.085: W/InputManagerService(90): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@415548b0 (uid=10009 pid=182)
01-30 05:14:02.125: W/NetworkManagementSocketTagger(90): setKernelCountSet(10009, 0) failed with errno -2
01-30 05:14:02.735: V/SenderTest1Activity(769): @@@@@onclicksendbroadcast
01-30 05:14:02.735: V/SenderTest1Activity(769): onclicksendbroadcast
01-30 05:14:02.776: V/MyIntentReceiver(977): #####shoudao

 




 

接收端Application3,用動態方式接收。(把Application1的發送的action變成("su.broadcast.send2");)

複製代碼
package com.myreceive.test2;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

import android.util.Log;
public class BroadcastReceiverTest2Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    private BroadcastReceiver br= new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Log.v("BroadcastReceiverTest2Activity","#####dongtaireceive");
        }
        
    };
    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        IntentFilter it = new IntentFilter();
        it.addAction("su.broadcast.send2");
        registerReceiver(br,it);
        Log.v("BroadcastReceiverTest2Activity","#####registerReceiver");
        
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onStop();
        unregisterReceiver(br);
        Log.v("BroadcastReceiverTest2Activity","#####unregisterReceiver");
    }
    
}
複製代碼

先運行Application3,不能退出(back),否則就unregisterReceiver了,也就不能收到發送端發送的廣播了。再運行Application1,點擊button,發送廣播,log信息如下:界面還是Application1的界面UI

01-30 07:13:14.918: V/SenderTest1Activity(651): @@@@@onclicksendbroadcast
01-30 07:13:14.918: V/SenderTest1Activity(651): onclicksendbroadcast
01-30 07:13:14.937: V/BroadcastReceiverTest2Activity(591): #####dongtaireceive

對於靜態Application2接收廣播來說,back之後也能接收到發送端發過來的廣播!

 注意:發送廣播並不能調起另一個Activity!一直顯示的都是發送廣播的那個Activity的UI!!

 

總結:

以發送intent爲例,發送廣播都用sendBroadcast(intent);

靜態註冊接收的時候,只需要

(1)得到action,如:

String action = intent.getAction();

(2)判斷action類型,做出相應的動作。

動態註冊接收的時候,需要:

(1) IntentFilter intentFilter= new IntentFilter();

(2)intentFilter.addAction(。。);可以添加多個

(3)註冊接收,registerReceiver(BroadcastReceiver對象,intentFilter);別忘了在其他需要的地方取消註冊接收!!!

(4)得到action,如:

 

String action = intent.getAction();
(5)判斷action類型,做出相應的動作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章