2015-08-25 239 views
2

我的广播接收器在应用程序启动时自动运行。防止在启动时启动服务

如何预防?我想通过点击按钮启动它。

广播接收器:

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); 
    } 
} 

IntentService:

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" /> 
+0

下面是一些有用的链接[安卓:启用](http://developer.android.com/guide/topics/manifest/receiver-element.html)和[Android的广播接收器与 - 无意图-filte](http://stackoverflow.com/questions/9060137/android-broadcastreceiver-with-no-intent-filter)。从按钮单击开始,您可以使用Intent intent = new Intent(getApplicationContext(),TestAlarmReceiver.class); sendBroadcast(intent); – avinash

回答

2

应设置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

我现在不能尝试,但是这应该起作用。

+0

感谢您的回答,现在就像一个魅力。我开始有点不同,因为我需要定时任务AlarmManager。 – burjulius

0

我用了相当粗糙的方法,但它适用于我! 在类的服务扩展广播接收器

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

哪里。

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