【问题标题】:Prevent a service from starting at startup防止服务在启动时启动
【发布时间】:2016-12-14 22:50:23
【问题描述】:

我的广播接收器会在应用启动时自动运行。

如何预防?我想在单击按钮时启动它。

广播接收者:

public class TestAlarmReceiver extends BroadcastReceiver {

    @DebugLog
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, TestService.class);
        i.putExtra("foo", "bar");
        context.startService(i);
    }
}

意图服务:

public class TestService extends IntentService {

    public TestService() {
        super("TestService");
    }

    @DebugLog
    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d(getClass().getSimpleName(), "Service is running");
    }
}

另外,我将这些行添加到应用程序部分的 AndroidManifest 文件中:

    <receiver
        android:name=".service.TestAlarmReceiver"
        android:process=":remote" />

    <service
        android:name=".service.TestService"
        android:exported="false" />

【问题讨论】:

标签: android service broadcastreceiver


【解决方案1】:

您应该在清单上为您的接收器设置android:enabled="false" (options for receiver),然后使用package Manager 激活它以启用它。 然后你可以在按钮点击上写这个函数:

public void enableReceiver(Context context) {
    ComponentName component = new ComponentName(context, TestAlarmReceiver .class);
    PackageManager pm = context.getPackageManager();
    pm.setComponentEnabledSetting(
                component,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
}

要在运行时停止接收器,您只需使用常量PackageManager.COMPONENT_ENABLED_STATE_DISABLED 而不是PackageManager.COMPONENT_ENABLED_STATE_ENABLED

我现在不能尝试,但这应该可以。

【讨论】:

  • 感谢您的回答,现在就像一个魅力。我开始有点不同,因为我需要 AlarmManager 来执行周期性任务。
【解决方案2】:

我使用了相当粗略的方法,但它对我有用! 在类中扩展 BroadcastReceiver

if (MyService.getInstance()==null) return;

服务地点。

private static MyService ins;
public static MyService getInstance() {
    return ins;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多