Intent一直在使用Null

时间:2018-01-28 10:20:34

标签: android android-intent android-service

我有两个应用程序A和B.在应用程序B我有一个服务,我可以从应用程序A运行它。我想有意图发送数据到应用程序B,但我的意图总是为空!

我使用此代码从应用A运行应用B的服务:

 try {

      String packageName = "app_B_package";
      String appService = packageName + ".activity.InternetService";

      Intent start = new Intent();
      start.setComponent(new ComponentName(packageName, appService));
      start.putExtra("LAUNCHER_COMMAND_CLOSE" , true);
      G.context.startService(start);

    } catch (Exception e) {
      e.printStackTrace();
    }

但是当app B的服务运行时,intent为null。这是应用B中服务的onStart

 @Override
  public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);

    Log.i("LOGO_OFFICE_IN", "onStart");

    if (intent != null) {

      if (intent.getExtras().getBoolean("LAUNCHER_COMMAND_CLOSE")) {

        Tools.clearApplicationData(InternetService.this);
        new AppStatus(InternetService.this).isAppRunning(getPackageName(), true);
      }
    }
  }

为什么我的意图一直都是空的?我找不到它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

看起来你的服务类型是点火 - 忘记了 - 它做了一件快速的事情,应该立即退出,因为它已经完成了。正确的吗?

1。不要让您的空闲服务运行

文档说

  

如果某个组件通过调用startService()启动该服务(这会调用onStartCommand()),该服务将继续运行,直到它自动停止stopSelf()或其他组件停止致电stopService()

所以在完成工作量后,请致电stopSelf()

当您的服务未运行时,无需重启。

2。使用正确的启动模式

除非你停止它,否则你的服务默认会在被系统杀死后自动重启(因为系统需要资源)。默认模式称为START_STICKY并执行此操作:

  

此模式适用于将在任意时间段内显式启动和停止运行的内容,例如执行背景音乐播放的服务。

由于您的服务是快速的一次性工作,因此稍后在任意时间重新启动它是没有意义的。

要让Android知道,您应该从START_NOT_STICKY返回onStartCommand

3。使用当前API

不要使用onStart,它在9年前已被弃用。它不支持上面提到的启动模式。而是实施onStartCommand。您的服务将如下所示:

@Override
public void onStartCommand(Intent intent, int flags, int startId) {
    // No super call.

    Log.i("LOGO_OFFICE_IN", "onStart");

    // Intent cannot be null.
    if (intent.getExtras().getBoolean("LAUNCHER_COMMAND_CLOSE")) {
        Tools.clearApplicationData(InternetService.this);
        new AppStatus(InternetService.this).isAppRunning(getPackageName(), true);
    }

    stopSelf(); // Work is done, stop service.

    return START_NOT_STICKY; // Don't restart if killed.
}

现在我想到了,只有第1步是绝对必要的。无论如何,养成使用当前API并找出工作原理的习惯。