首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使意图活在幕后

如何使意图活在幕后
EN

Stack Overflow用户
提问于 2014-02-07 08:33:45
回答 1查看 173关注 0票数 0

这个问题可能看上去很模糊,因为Intent在很大程度上生活在后台,我同意它,但我正在使用Intent过滤器--通过编程-- .I正在放置两个按钮,注册和注销。当按下寄存器时,Intent过滤器的注册工作也是一样的。现在,当我按下注册按钮并将应用程序放在后台时,吐司信息将不会显示。但是,我希望只有当用户显式地按下“注销”按钮时,Intent过滤器才会停止接收消息。

我正在使用以下代码:

代码语言:javascript
复制
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);


}



}
EN

回答 1

Stack Overflow用户

发布于 2014-02-07 09:01:00

正如在BroadcastReceiver文档中所解释的,通过Activity.registerReceiver()程序注册的广播接收器在活动不运行时不会接收任何广播:

如果在Activity.onResume()实现中注册接收器,则应该在Activity.onPause()中注销它。(暂停时不会收到意图,这将减少不必要的系统开销)

您可以考虑使用背景Service并在其上注册广播接收器(参见在服务中注册接收者)。

或者,正如@doctoror驱动器所指出的,您可以静态地在清单文件中注册接收器,并使用PackageManager以编程方式启用/禁用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21622847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档