我正在创建一个应用程序,其唯一的组件是service
,它继续在后台运行(基本上是代理服务器),但我无法找到如何启动该服务的方法。应用程序无法进行任何UI或用户交互,因此我不使用Activity
Broadcast receiver
可以收听BOOT广播,但是如何在安装时首次启动服务,如何让它保持运行?
或是否有一个广播,我可以在安装应用程序后收听,例如可能是TIME_TICK,但必须从我认为的活动中注册。
答案 0 :(得分:43)
不幸的是,目前在安装应用程序后没有可靠的方法来接收广播事件,ACTION_PACKAGE_ADDED Intent不会广播到新安装的软件包。
您必须拥有广播接收器类以及您的服务才能收到ACTION_BOOT_COMPLETED事件。我还建议添加ACTION_USER_PRESENT意图被该广播接收器捕获,这需要Android 1.5(minSDK = 3),这将在用户解锁手机时呼叫您的广播接收器。您可以做的最后一件事是尝试让服务保持运行而不会轻易自动关闭,可以在服务onCreate中调用Service.setForeground()告诉Android您的服务不应该被停止,这主要是对于必须继续运行但可供任何服务使用的mp3播放器类型服务。
确保为清单中的boot_complete和user_present事件添加适当的权限。
这是一个简单的类,您可以将其用作事件的广播接收器。
package com.snctln.util.WeatherStatus;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class WeatherStatusServiceReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(intent.getAction() != null)
{
if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
intent.getAction().equals(Intent.ACTION_USER_PRESENT))
{
context.startService(new Intent(context, WeatherStatusService.class));
}
}
}
};
祝你好运。
答案 1 :(得分:14)
在START_STICKY
Service.onStartCommand
Android将重启您的服务
答案 2 :(得分:0)
我正在研究同一个问题。这是我发现的: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html
这个简单的小演示通过在BroadcatReceiver
和Service
之间播放一些乒乓来展示解决方案。通过在Manifest中注册接收ACTION_BOOT_COMPLETED
,Receiver在注册时启动。它只是在接收ACTION_BOOT_COMPLETED
时启动服务。 Service
依次为BroadcastReceiver
注册ACTION_TIME_TICK
。
app逻辑将在BroadcastReceiver
。