【问题标题】:Android keep BroadcastReceiver in backgroundAndroid将BroadcastReceiver保持在后台
【发布时间】:2014-03-07 17:56:16
【问题描述】:

我创建了一个 BroadcastReceiver,它仅在我的应用程序显示在最近的应用程序菜单中时运行。如果我从最近的应用程序中删除我的应用程序,BroadcastReceiver 将停止工作。 如何将 BroadcastReceiver 保持在后台?

我从我的主要活动(在 OnCreate() 中)注册了 BroadcastReceiver。

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(receiver, intentFilter);

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

    }   
};

【问题讨论】:

标签: android broadcastreceiver android-service background-process android-broadcast


【解决方案1】:

这不是您应该注册接收器的方式。您的接收器停止工作,因为您在 onCreate 中构建它,这意味着只要您的应用程序还活着,它就会一直存在。当应用程序被破坏时,您也会失去接收者。

如果您在 Activity 中注册接收器,则应始终在 onResume 中注册它并在 onPause 中取消注册,这将使其在该 Activity 对用户可见时可用。当您希望在用户与活动交互时拥有一个活动接收器时,这是一个用例。

如果你想要一个后台接收器,你需要在AndroidManifest 中注册它(带有意图过滤器),添加一个IntentService 并在接收器中接收到广播时启动它。

这里是tutorial,你对第3章感兴趣。

如果您需要始终在线,请启动前台服务。服务中有一个功能可以让您:startForeground。然后在创建服务时注册您的接收器,并在服务被销毁时取消注册。不过前台服务很讨厌。

【讨论】:

  • 好的,你必须在这里详细说明你想要达到的目标。
  • 我想在电池50%的时候调用一个方法(即使应用程序关闭了)。
  • 在启动时开始的Service 中注册它们。
  • 以及如何将服务保持在自己的进程中?
  • 添加了关于您可以使用的前台服务的评论。
【解决方案2】:

使用服务。 如果有正确的标志示例,服务可以在应用死机时继续存在:

public class MyService extends Service {
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY; //this defines this service to stay alive
    }
@Override
public void onCreate() {
    super.onCreate();

    appStatus = APPISUP;

    //This is a thread that stays alive for as long as you need
    new CheckActivityStatus().execute();
    //Not needed but in case you wish to lauch other apps from it
}

private class CheckActivityStatus extends AsyncTask<String, Integer, String> {
 @Override
    protected String doInBackground(String... params) {
        while(true) {
        ... //add something that breaks eventually
        }
    }
 }

要启动服务,您必须从这样的活动中启动它:

Intent service = new Intent(getBaseContext(), MyService.class);
    startService(service);

使用该服务,BroadcastReceiver 仍然可以接收您想要的任何内容。 请注意,服务有时会停止并返回。我还没有找到原因,但我在押注可能要求系统停止服务的其他应用程序的优先级

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多