我有两个应用程序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);
}
}
}
为什么我的意图一直都是空的?我找不到它。
感谢您的帮助。
答案 0 :(得分:1)
看起来你的服务类型是点火 - 忘记了 - 它做了一件快速的事情,应该立即退出,因为它已经完成了。正确的吗?
文档说
如果某个组件通过调用
startService()
启动该服务(这会调用onStartCommand()
),该服务将继续运行,直到它自动停止stopSelf()
或其他组件停止致电stopService()
。
所以在完成工作量后,请致电stopSelf()
。
当您的服务未运行时,无需重启。
除非你停止它,否则你的服务默认会在被系统杀死后自动重启(因为系统需要资源)。默认模式称为START_STICKY
并执行此操作:
此模式适用于将在任意时间段内显式启动和停止运行的内容,例如执行背景音乐播放的服务。
由于您的服务是快速的一次性工作,因此稍后在任意时间重新启动它是没有意义的。
要让Android知道,您应该从START_NOT_STICKY
返回onStartCommand
。
不要使用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并找出工作原理的习惯。