2012-07-14 211 views
0

我有一個應用程序具有在啓動時有條件啓動的服務(基於xml中定義的複選框首選項)。我的廣播接收機類是這樣的:BroadcastReceiver在啓動時無條件啓動服務,無需啓動應用程序

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 
import android.util.Log; 

public class BootServiceReceiver extends BroadcastReceiver { 
private static final String TAG = "tweakmanager"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
     SharedPreferences prefLights; 
     prefLights = PreferenceManager.getDefaultSharedPreferences(context); 
     if (prefLights.getBoolean("checkbox1", false)) { 
      Log.i(TAG, "doing nothing..."); 
     } else { 
      Intent p = new Intent(); 
      p.setAction("app.tweaks.Service"); 
      context.startService(p); 
     } 
    } 
} 
} 

請注意,服務只應在複選框未選中時啓動。默認狀態被選中。

現在,正常運行時,所有工作都正常 - 如果複選框被選中,服務不會啓動,如果未選中服務,服務將在啓動時啓動。

問題在於,如果應用程序已安裝但從未運行......在這種情況下,即使選中複選框,服務也會在下次啓動時啓動。我想過寫默認的喜好,可以被接收器讀取的文件,但我不認爲這是最好的解決辦法...

回答

2

在這種情況下,服務開始於即使複選框下次開機檢查

它不應該這樣做,因爲不會有偏好,所以當你指定你的getBoolean()應返回false

話雖這麼說,有一個更好的解決方案:

  1. 添加android:enabled="false"到清單此<receiver>元素。

  2. 當他們切換偏好複選框,使用PackageManagersetComponentEnabledSetting()啓用或禁用BroadcastReceiver,當複選框被選中,這樣你被啓用。

這樣,如果用戶沒有選中此複選框,Android就不必在重新引導時分叉進程。

+0

這應該是那麼容易......我想像我這樣的前輩總是採取艱難而複雜的方式。謝謝,我會馬上嘗試。 – BlooregardQKazoo 2012-07-14 10:49:15

+0

您的建議工作得很好,謝謝! – BlooregardQKazoo 2012-07-14 12:02:35

相關問題