我正试图在手机启动时将我的服务注册到启动。
我在服务类中设置了一个BOOT_COMPLETED BroadcastReciever:
public int onStartCommand(Intent intent, int flags, int startId)
{
startService(intent);
_bootCompletedReciever = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
Log.d(TAG, "Got boot completed");
}
};
IntentFilter filter = new IntentFilter("android.intent.action.BOOT_COMPLETED");
registerReceiver(_bootCompletedReciever, filter);
return START_NOT_STICKY;
}
然而它没有被召唤。我在清单中设置了权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
在电话启动时(如果没有在清单中注册广播),您是否知道我在服务中播放此广播时所缺少的内容?
答案
在这种情况下我必须使用XML来注册一个在启动时调用我的服务的类:
public class BootBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent service = new Intent(context, S_GPS.class);
context.startService(service);
}
}
在清单中:
<receiver android:name=".BroadcastReceivers.BootBroadcastReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
答案 0 :(得分:1)
您在那里注册的接收器无法在重新启动后继续存在,这是不可能的,因为它是动态注册的,并且注册在重启时会丢失。
您可以做的是在清单中注册接收器,但将接收器设置为DISABLED,使用此标志:
android:enabled=["true" | "false"]
然后,您可以使用包管理器以编程方式将其设置为启用
context.getPackageManager()
.setComponentEnabledSetting(ComponentName componentName, int newState, int flags);
来自文档:
componentName The component to enable
newState The new enabled state for the component. The legal values for this state are:
COMPONENT_ENABLED_STATE_ENABLED, COMPONENT_ENABLED_STATE_DISABLED and COMPONENT_ENABLED_STATE_DEFAULT
The last one removes the setting, thereby restoring the component's state to whatever was set in it's manifest (or enabled, by default).
flags Optional behavior flags: DONT_KILL_APP or 0.
有关详细信息,请参阅包管理器文档。
答案 1 :(得分:1)
谁将在启动时启动您的服务,以便调用onstartcommand() 那样不行。您必须在清单中静态注册接收器,并在接收器的onReceive()中执行您想要的操作。
请查看此post。