Android 如何让意图活在背景中
这个问题可能看起来很模糊,因为Android 如何让意图活在背景中,android,android-intent,intentfilter,Android,Android Intent,Intentfilter,这个问题可能看起来很模糊,因为Intent几乎都是生活在后台。我同意这一点,但我使用的是Intent程序化过滤器。我设置了两个按钮,注册和取消注册。当按下register时,Intentfilter被注册,其作用与unregister相同。现在,当我按下“注册”按钮并将应用程序放在后台时,将不会显示toast消息。但是我希望Intent过滤器仅在用户明确按下unregister按钮时停止接收消息 我正在使用此代码: public class MainActivity extends Activi
Intent
几乎都是生活在后台。我同意这一点,但我使用的是Intent
程序化过滤器。我设置了两个按钮,注册和取消注册。当按下register时,Intent
filter被注册,其作用与unregister相同。现在,当我按下“注册”按钮并将应用程序放在后台时,将不会显示toast消息。但是我希望Intent
过滤器仅在用户明确按下unregister按钮时停止接收消息
我正在使用此代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);
// Show alert
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + message, duration);
toast.show();
} // end for loop
} // bundle is null
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
};
public void register(View view){
this.registerReceiver(broadcastReceiver, new IntentFilter(
"android.provider.Telephony.SMS_RECEIVED"));
}
public void unRegister(View view){
this.unregisterReceiver(broadcastReceiver);
}
}
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private BroadcastReceiver BroadcastReceiver=新的BroadcastReceiver(){
//获取SmsManager的对象
final smsmsmanager sms=smsmsmanager.getDefault();
@凌驾
公共void onReceive(上下文、意图){
//TODO自动生成的方法存根
//从意图检索扩展数据的映射。
final Bundle=intent.getExtras();
试一试{
if(bundle!=null){
最终对象[]pdusObj=(对象[])bundle.get(“pdus”);
对于(int i=0;i
如中所述,通过活动编程注册的广播接收器。registerReceiver()
在活动未运行时不会接收任何广播:
如果在Activity.onResume()实现中注册接收者,则应在Activity.onPause()中注销该接收者。(暂停时不会收到意图,这将减少不必要的系统开销)
你可以考虑使用背景<代码>服务<代码>,并在上面登记你的广播接收器(参见)。
或者,正如@doctoror drive所指出的,您可以在清单文件中静态注册接收方,并使用
PackageManager
以编程方式启用/禁用它。你不需要任何服务。相反,我们必须在清单中注册一个静态接收者。@doctordrive:问题是我在回避static@VamsiPavanMahesh你在避免静态什么?静态接收器..因为它会调用应用程序always@VamsiPavanMahesh如果你需要一个接收器来调用你的应用程序,它需要是静态的。如果你只需要静态接收器一段时间,你可以取消注册,这似乎是公平的。。我必须检查一下..谢谢@MikeM.@MikeM:以你的方式实现。。没问题。。谢谢