2013-03-19 48 views
0

我知道我可以使用正在進行的通知讓我的服務保持活動狀態,但我有一個持有廣播接收器的服務。我不想使用通知來簡單地握住我的廣播接收器。我知道我也可以在我的應用程序的清單中註冊我的接收器,但我希望用戶能夠控制接收器是否處於活動狀態。如何在沒有正在進行通知的情況下讓服務保持活躍狀態​​

以下是不斷重新啓動的服務。

public class DockServiceListener extends Service{ 

IntentFilter filter; 
BroadcastReceiver mReceiver; 

public void onCreate() { 
    super.onCreate(); 

    Toast.makeText(getApplicationContext(), "Receiver started!", Toast.LENGTH_SHOR 

    filter = new IntentFilter(Intent.ACTION_DOCK_EVENT); 
    mReceiver = new DockReceiver(); 

} 

public int onStartCommand(Intent intent, int flags, int id) { 
    super.onStartCommand(intent, START_STICKY, id); 

    registerReceiver(mReceiver, filter); 

    return id; 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

很簡單。我也知道它可能是Android清理,但Facebook Messenger和其他服務如何不被關閉?除非我不知道它導致它沒有吐司消息?或者有沒有辦法只運行一次創建?

好無論如何,謝謝大家的期待!希望有人能更好地教育我! :)

編輯:新方法想知道這是正確的嗎?

startBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      PackageManager pm = getApplicationContext().getPackageManager(); 
      ComponentName dockReceiver = new ComponentName(getApplicationContext(), DockReceiver.class); 
      pm.setComponentEnabledSetting(dockReceiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0); 
      finish(); 



     } 
    }); 

    stopBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      PackageManager pm = getApplicationContext().getPackageManager(); 
      ComponentName dockReceiver = new ComponentName(getApplicationContext(), DockReceiver.class); 
      pm.setComponentEnabledSetting(dockReceiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); 
      finish(); 

     } 
    }); 

回答

1

我知道我還可以註冊我的我的應用程序的清單內的接收器,但我希望用戶能夠控制接收器是否激活。

然後使用PackageManagersetComponentEnabledSetting()啓用或禁用BroadcastReceiver是在清單中註冊。您無需爲了控制「接收器是否處於活動狀態」而使用服務浪費用戶的RAM。

+0

我編輯了我的問題,是新的編輯方式嗎?它似乎在工作。我在我的Manifest中激活它,它似乎是用按鈕來完成這項工作。只是想知道我的語法和位置是否正確。我確實將「0」更改爲「-1」,看起來更平滑。 – Seth 2013-03-19 18:41:21

+0

@Seth:無論你看到它,你都可以擺脫'getApplicationContext()'。我不知道'finish()'是否有必要,這取決於你想要做什麼。 – CommonsWare 2013-03-19 18:57:16

+0

我在按鈕上點擊'finish()',使用戶不必手動按下後退按鈕或主頁按鈕即可離開我的活動。只是試圖爲用戶刪除不需要的步驟。由於沒有Context參數,所以當我刪除'getApplicationContext()'時會出錯。這就是eclipse所說的「ComponentName(Context,)」它適用於我包含'getApplicationContext()'時是否還有別的東西我應該使用呢? – Seth 2013-03-19 19:29:06

相關問題