Android BroadcastReceiver应用程序没有';应用程序关闭时不会死亡

Android BroadcastReceiver应用程序没有';应用程序关闭时不会死亡,android,sms,Android,Sms,我正在尝试创建一个读取文本消息的应用程序。该应用程序运行良好,当我收到一条短信时,该短信将与电话号码一起显示在祝酒辞中。问题是,即使应用程序关闭(不在前台),当我收到一条短信时,它仍然会显示祝酒词。我使用了一个任务杀手应用程序,但它仍然显示了我的目标。不显示toast的唯一方法是统一安装应用程序。我使用这个网站作为教程 除了加密,我已经完成了教程中的所有工作 感谢您的帮助 谢谢, 克里斯事实上,这是正确的行为。每次你收到一条信息,系统就会发送一条短信广播。由于您的应用程序在其清单中声明希望接收

我正在尝试创建一个读取文本消息的应用程序。该应用程序运行良好,当我收到一条短信时,该短信将与电话号码一起显示在祝酒辞中。问题是,即使应用程序关闭(不在前台),当我收到一条短信时,它仍然会显示祝酒词。我使用了一个任务杀手应用程序,但它仍然显示了我的目标。不显示toast的唯一方法是统一安装应用程序。我使用这个网站作为教程

除了加密,我已经完成了教程中的所有工作

感谢您的帮助

谢谢,
克里斯

事实上,这是正确的行为。每次你收到一条信息,系统就会发送一条短信广播。由于您的应用程序在其清单中声明希望接收此类广播,因此每次都将创建并执行一个新的BroadcastReceiver实例

如果您希望仅在特定时间执行接收器(在本例中,当您的应用程序位于前台时),则必须使用和在代码中动态注册和注销接收器,而不是在清单中

如何准确地执行此操作?

这里有一个简短的例子。我假设您已经编写了自己的类,该类扩展了BroadcastReceiver并处理
onReceive()
中的内容。本例中此类的名称为
SmsReceiver
,如链接教程中所示

我们的目标是仅当一个活动位于前台时接收广播,这意味着您还应该有一个类来扩展活动并像普通应用程序一样显示UI

首先,我们需要一个实际的接收方实例作为类成员。在活动类中添加以下内容:

private SmsReceiver smsReceiver = new SmsReceiver();
旁注:这实际上是在清单和代码中注册的主要区别之一:

  • 在代码中,您可以自己创建一个接收方实例
  • 在清单中注册后,系统会在后台为您生成实例
好的,很好。现在,当活动进入前台并退出前台时,我们只需注册和注销此接收器。查看中的图表,这些事件中调用的框架方法是
onResume()
onPause()

将以下行添加到
onResume()
方法中:

@Override 
public void onResume() {

    IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(smsReceiver, filter);
}
我们在这里做的其实很简单。它是清单
标记的代码等价物。我们创建了一个意图过滤器,其中包含一个我们喜欢接收的广播,并向它注册我们的接收器

下一步是在
onPause()
中注销。同样,如果尚未创建,请添加此行或创建
onPause()

@Override
public void onPause() {
    unregisterReceiver(smsReceiver);
}

非常简单-以我们的receiver实例为例,在应用程序即将进入后台时注销它。这就是所有的魔力,一切都应该按计划进行当您使用现有代码时,不要忘记删除清单中的整个
标记。否则,您将通过两种方式注册您的接收器。

这实际上是正确的行为。每次你收到一条信息,系统就会发送一条短信广播。由于您的应用程序在其清单中声明希望接收此类广播,因此每次都将创建并执行一个新的BroadcastReceiver实例

如果您希望仅在特定时间执行接收器(在本例中,当您的应用程序位于前台时),则必须使用和在代码中动态注册和注销接收器,而不是在清单中

如何准确地执行此操作?

这里有一个简短的例子。我假设您已经编写了自己的类,该类扩展了BroadcastReceiver并处理
onReceive()
中的内容。本例中此类的名称为
SmsReceiver
,如链接教程中所示

我们的目标是仅当一个活动位于前台时接收广播,这意味着您还应该有一个类来扩展活动并像普通应用程序一样显示UI

首先,我们需要一个实际的接收方实例作为类成员。在活动类中添加以下内容:

private SmsReceiver smsReceiver = new SmsReceiver();
旁注:这实际上是在清单和代码中注册的主要区别之一:

  • 在代码中,您可以自己创建一个接收方实例
  • 在清单中注册后,系统会在后台为您生成实例
好的,很好。现在,当活动进入前台并退出前台时,我们只需注册和注销此接收器。查看中的图表,这些事件中调用的框架方法是
onResume()
onPause()

将以下行添加到
onResume()
方法中:

@Override 
public void onResume() {

    IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(smsReceiver, filter);
}
我们在这里做的其实很简单。它是清单
标记的代码等价物。我们创建了一个意图过滤器,其中包含一个我们喜欢接收的广播,并向它注册我们的接收器

下一步是在
onPause()
中注销。同样,如果尚未创建,请添加此行或创建
onPause()

@Override
public void onPause() {
    unregisterReceiver(smsReceiver);
}

非常简单-以我们的receiver实例为例,在应用程序即将进入后台时注销它。这就是所有的魔力,一切都应该按计划进行当您使用现有代码时,不要忘记删除清单中的整个
标记。否则,您将通过两种方式注册接收者。

您可以将
toast
视为一种系统通知。因此,无论前台是否有任何
活动
,它都会显示出来。此外,当您扩展
BroadcastReceiver
时,只要您的进程处于活动状态,您的类仍将接收意图。A