Mars Chen动态注册Broadcast广播监听器的实现
2015-08-28 16:42
651 查看
总结:
(1)动态注册Broadcast监听器与在manifest直接配置receiver不同在于:
manifest中的receiver及时你的activity和应用程序退出了,该监听依然还在,类似Windows中注册表的信息;
而动态注册broadcast监听器可以在任何函数根据用户需求随时释放监听器,不再监听对应的broadcast消息
(2)manifest文件中<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
这个配置很重要。需要将每类broadcast消息的权限进行设置,如果不做该步骤,则动态注册后的监听器也无法工作。
1.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testbroadcastreciver2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testbroadcastreciver2.MainActivity"
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>
<!-- 这句话很重要,没有这个设置,reciever无法 响应-->
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>
2.MainActivity.java //绑定和解除对监听器的绑定
package com.example.testbroadcastreciver2;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button register = null;
private Button unregister = null;
private TestReceiver testReceiver = null;
//定义接收短信操作
private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
register = (Button)findViewById(R.id.register);
unregister = (Button)findViewById(R.id.unregister);
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
testReceiver = new TestReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SMS_ACTION);
MainActivity.this.registerReceiver(testReceiver, intentFilter);
}
});
unregister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
MainActivity.this.unregisterReceiver(testReceiver);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3.TestReceiver.java //实现监听器
package com.example.testbroadcastreciver2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class TestReceiver extends BroadcastReceiver {
public TestReceiver() {
;
}
/* (non-Javadoc)
* @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
*/
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("Receive a message");
Bundle bundle = new Bundle();
bundle = intent.getExtras();
Object[] myOBJpdus = (Object[])bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
System.out.println(messages.length);
for (int i = 0; i<myOBJpdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]);
System.out.println(messages[i].getDisplayMessageBody());
}
}
}
(1)动态注册Broadcast监听器与在manifest直接配置receiver不同在于:
manifest中的receiver及时你的activity和应用程序退出了,该监听依然还在,类似Windows中注册表的信息;
而动态注册broadcast监听器可以在任何函数根据用户需求随时释放监听器,不再监听对应的broadcast消息
(2)manifest文件中<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
这个配置很重要。需要将每类broadcast消息的权限进行设置,如果不做该步骤,则动态注册后的监听器也无法工作。
1.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testbroadcastreciver2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testbroadcastreciver2.MainActivity"
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>
<!-- 这句话很重要,没有这个设置,reciever无法 响应-->
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>
2.MainActivity.java //绑定和解除对监听器的绑定
package com.example.testbroadcastreciver2;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button register = null;
private Button unregister = null;
private TestReceiver testReceiver = null;
//定义接收短信操作
private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
register = (Button)findViewById(R.id.register);
unregister = (Button)findViewById(R.id.unregister);
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
testReceiver = new TestReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SMS_ACTION);
MainActivity.this.registerReceiver(testReceiver, intentFilter);
}
});
unregister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
MainActivity.this.unregisterReceiver(testReceiver);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3.TestReceiver.java //实现监听器
package com.example.testbroadcastreciver2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class TestReceiver extends BroadcastReceiver {
public TestReceiver() {
;
}
/* (non-Javadoc)
* @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
*/
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("Receive a message");
Bundle bundle = new Bundle();
bundle = intent.getExtras();
Object[] myOBJpdus = (Object[])bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
System.out.println(messages.length);
for (int i = 0; i<myOBJpdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]);
System.out.println(messages[i].getDisplayMessageBody());
}
}
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories