2015-08-25 309 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; 
}