android 4 完全退出程序 广播机制 代码,Android广播机制

1、广播机制

(1、广播接收者在Android中注册

(2、当一个事件产生后,它可以发送一个广播信息,然后这些接收者来接收这些信息

(3、广播接收者的实现一般是写成一个类,该类继承Android提供的类BroadcastReceiver,并且复写该类的onCreate方法,在该方法中实现接收到信息后的处理过程

2、实例

例1:采用在 Mainifest.xml文件中注册BroadcastReceiver

首先在发送端Main.java建立一个intent,然后通过它的setAction方法设置接收器的action类型,

最后在activity中启动broadcast,即sendBroadcast(intent)函数

0818b9ca8b590ca3270a3433284dd417.png

TestReceiver.java

0818b9ca8b590ca3270a3433284dd417.png

1 package zzl.broadcast_01;

2

3 import android.content.BroadcastReceiver;

4 import android.content.Context;

5 import android.content.Intent;

6

7 public class TestReceiver extends BroadcastReceiver{

8

9 public TestReceiver()

10 {

11 System.out.println("TestReceiver");

12

13 }

14 @Override

15 public void onReceive(Context arg0, Intent arg1) {

16 System.out.println("OnReceiver");

17

18 }

19 }

0818b9ca8b590ca3270a3433284dd417.png

Main.java

0818b9ca8b590ca3270a3433284dd417.png

1 package zzl.broadcast_01;

2

3 import android.app.Activity;

4 import android.content.Intent;

5 import android.os.Bundle;

6 import android.view.Menu;

7 import android.view.View;

8 import android.view.View.OnClickListener;

9 import android.widget.Button;

10

11 public class Main extends Activity {

12

13 private Button insert = null;

14 @Override

15 protected void onCreate(Bundle savedInstanceState) {

16 super.onCreate(savedInstanceState);

17 setContentView(R.layout.activity_main);

18

19 insert=(Button)findViewById(R.id.insert);

20 insert.setOnClickListener(new MyStartOnClickListener());

21 }

22 public class MyStartOnClickListener implements OnClickListener

23 {

24

25 public void onClick(View arg0) {

26 //TODO Auto-generated method stub27

28 //采用intent发送数据

29 Intent intent = new Intent();

30 //只发送给action为ACTION_EDIT的对象,对应Manifest中的action

31 intent.setAction(Intent.ACTION_EDIT);

32 //*通过广播方式发送该intent,只有特定action的接收者才能收到该广播信息*/

33 Main.this.sendBroadcast(intent);

34 }

35 }

36 @Override

37 public boolean onCreateOptionsMenu(Menu menu) {

38 //Inflate the menu; this adds items to the action bar if it is present.

39 getMenuInflater().inflate(R.menu.activity_main, menu);

40 return true;

41 }

42

43 }

0818b9ca8b590ca3270a3433284dd417.png

结果:

0818b9ca8b590ca3270a3433284dd417.png

3、实例1总结

需要在Android中注册,也就是说在Manifest中,需要在中有这样的代码:

1

3

4

5

6

4、实例2

(1、 BroadcastReceive用于监听被广播的事件(intent),为此它必须进行注册,与例子1中在Manifest.xml当中进行注册的注册方法不同,

例子2将引入第二种方法,在应用程序的代码中进行注册。在例1中,如果应用程序已经关闭,BroadcastReceive都会处于活动状态,都会接收到广播信息。这个就需要各取所需

了。

(2、如果一个BroadcastReceive用于更新UI,则采用在代码中进行注册:Activity启动时注册,关闭时取消注册。

【注册】 registerReceiver(receiver ,filter) ; 【取消注册】 unregisterRecevier(receiver);

0818b9ca8b590ca3270a3433284dd417.png

MainActivity.java

0818b9ca8b590ca3270a3433284dd417.png

1 package zzl.broadcast_02;

2

3 import android.app.Activity;

4 import android.content.IntentFilter;

5 import android.os.Bundle;

6 import android.view.Menu;

7 import android.view.View;

8 import android.view.View.OnClickListener;

9 import android.widget.Button;

10

11 public class MainActivity extends Activity {

12

13 private Button registe=null;

14 private Button unregiste=null;

15 private SMSReceiver smsReceiver=null;

16 private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";

17 @Override

18 protected void onCreate(Bundle savedInstanceState) {

19 super.onCreate(savedInstanceState);

20 setContentView(R.layout.activity_main);

21

22 registe=(Button)findViewById(R.id.regiest);

23 unregiste=(Button)findViewById(R.id.unregiest);

24

25 registe.setOnClickListener(new RegisterRecevierListener());

26 unregiste.setOnClickListener(new UnRegisterRecevierListener());

27 }

28

29 class RegisterRecevierListener implements OnClickListener{

30

31 @Override

32 public void onClick(View v) {

33 //TODO Auto-generated method stub

34 /*1、生成一个BroadcastRecevier对象35 * 2、生成一个intentFilter对象(和Manifest中的Filter)36 * 3、为IntentFilter添加一个Action:SMS_ACTION37 * (只有filter中的action和intent中的action一样)38 * 4、将BroadcastRecevier对象注册到系统当中39 **/

40 smsReceiver =new SMSReceiver();

41 IntentFilter filter=new IntentFilter();

42 filter.addAction(SMS_ACTION);

43 MainActivity.this.registerReceiver(smsReceiver,filter);

44 System.out.println("promise to receive message");

45 }

46 }

47 class UnRegisterRecevierListener implements OnClickListener{

48

49 @Override

50 public void onClick(View v) {

51 //TODO Auto-generated method stub52 //解除BroadcastRecevier对象注册

53 MainActivity.this.unregisterReceiver(smsReceiver);

54 System.out.println("unpromise to receive message");

55 }

56 }

57

58

59 @Override

60 public boolean onCreateOptionsMenu(Menu menu) {

61 //Inflate the menu; this adds items to the action bar if it is present.

62 getMenuInflater().inflate(R.menu.activity_main, menu);

63 return true;

64 }

65

66 }

0818b9ca8b590ca3270a3433284dd417.png

SMSReceiver.java

0818b9ca8b590ca3270a3433284dd417.png

1 package zzl.broadcast_02;

2

3 import android.content.BroadcastReceiver;

4 import android.content.Context;

5 import android.content.Intent;

6 import android.os.Bundle;

7 import android.telephony.SmsMessage;

8

9

10 public class SMSReceiver extends BroadcastReceiver{

11

12 @Override

13 public void onReceive(Context context, Intent intent) {

14 //TODO Auto-generated method stub

15 System.out.println("receive message");

16

17 //通过intent获得bundle对象中的数据

18 Bundle bundle = intent.getExtras();

19 //在bundle对象中有个名为“pdus”的属性,这个属性的值是object数组

20 Object[] myOBJpdus = (Object[])bundle.get("pdus");

21 //新建一个SmsMessage数组:用于存储消息内容的

22 SmsMessage[] messages = new SmsMessage[myOBJpdus.length];

23 System.out.println(messages.length);

24 for(int i = 0; i < messages.length; i++)

25 {

26 //使用object数组当中的对象创建SmsMessage对象:

27 messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]);

28 //调用SmsMessage对象的getDisplayMessageBody()方法,就可以得到消息的内容

29 System.out.println(messages[i].getDisplayMessageBody());

30 }

31 }

32 }

0818b9ca8b590ca3270a3433284dd417.png

结果:

0818b9ca8b590ca3270a3433284dd417.png

5、实例2总结

(1、 设置的action过滤为"android.provider.Telephony.SMS_RECEIVED",即只有具备该action的广播接收器才能给接收到短信。

(2、 发送短信采用的是DDMS来模拟的,即该短信的发送是由另外的程序执行的。

DDMS发送出来的短信息是通过intent发送的,intent里面就自带了名为"android.provider.Telephony.SMS_RECEIVED"的action。

0818b9ca8b590ca3270a3433284dd417.png

(3、要使自己写的android程序能够收到短信息来临的广播,则不管是在应用程序中注册broadcastReceiver还是在Manifest.xml中注册,

在manifest.xml文件中必须添加一句代码:

并且该代码是和application平级的,也就是说是manifest的直接子标签.如果没有改句,即使程序中注册过广播接收,同样也收不到短信的。

一开始没有意识到这个问题,导致程序在测试过程中,出现了bug,百度过后才找到原因,以此为戒。

文章转自:http://www.cnblogs.com/daomul/archive/2013/03/03/2935960.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值