android学习之-BroadcastReceiver

广播有两种形式:

1.android系统广播,例如低电量,开机,壁纸变化,短息接受等广播。

2.自定义的广播 自定定义广播,供自己的应用接受。

广播的注册方式有两种:

1.静态注册

在项目清单中使用过滤器注册:

<receiver android:name="com.enterise.always.receiver.SmsReceiver">

<intent-filter>

<action  android:name="android.provider.Telephony.SMS_RECEIVED"/>

</intent-filter>

</receiver>

2.动态注册

在代码中注册:

  SmsReceiver receiver = new SmsReceiver();

  IntentFilter filter = new IntentFilter();

  filter.addAction("");

  this.registerReceiver(receiver, filter);

示例:

1.系统广播(短信接受监听)

在项目清单中注册广播:

<receiver android:name="com.enterise.always.receiver.SmsReceiver">
  <intent-filter>
   <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
  </intent-filter>
 </receiver>

添加权限

<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
 <uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->

 

编写一个类继承BroadcaseReceiver

public class SmsReceiver extends BroadcastReceiver{
 private static String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
 @SuppressWarnings("deprecation")
 @Override
 public void onReceive(Context context, Intent intent) {
  
  if(intent.getAction().equals(SMS_RECEIVED)) {
   SmsManager sms = SmsManager.getDefault();
   Bundle bundle = intent.getExtras();
   if(bundle != null) {
    Object[] pdus = (Object[]) bundle.get("pdus");
    SmsMessage[] messages = new SmsMessage[pdus.length];
    for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
     for (SmsMessage message : messages){
      String msg = message.getMessageBody();
//      String to = message.getOriginatingAddress();
      String to="手机号码";
      sms.sendTextMessage(to, null, msg, null, null);
     }
   }
  }


示例2:

自定义广播:

package com.enterise.always.activity;
import com.enterise.always.receiver.MyReceiver;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
 private static String MY_ACTION = "com.enterise.always.receiver_action";
 private Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        MyReceiver receiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(MY_ACTION);
        this.registerReceiver(receiver, filter);
        
        button = (Button)this.findViewById(R.id.main_submit);
        button.setOnClickListener(this);
        
    }
 @Override
 public void onClick(View v) {
  if(v.equals(button)) {
   
   Intent intent = new Intent();
   intent.setAction(MY_ACTION);
   intent.putExtra("name", "java");
   sendBroadcast(intent);
  }
 }
}

package com.enterise.always.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver{
 private static String MY_ACTION = "com.enterise.always.receiver_action";
 private static String TAG = "MyReceiver";
 @Override
 public void onReceive(Context context, Intent intent) {
  
  String action = intent.getAction();
  if(action == MY_ACTION) {
   Bundle extras = intent.getExtras();
   if(extras != null) {
    String name = (String)extras.get("name");
    Log.d(TAG, name);
   }
  }
 }

注意的事项:

 在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法。

 onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。

当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)错误对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的所在进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值