2017-01-18 24 views
0

我有一項服務,在該服務中,我已經註冊了一個簡單的廣播接收器來檢查設備是否從充電器插入/拔出。我通過調用啓動該服務,內部創建BroadcastReceiver時發出服務

 Intent intent = new Intent(MyActivity.this,TestReceiverService.class); 
     startService(intent); 

TestReceiverService.class

public class TestReceiverService extends Service { 
@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    registerTestReceiver(); 
} 


private void registerTestReceiver() { 

    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 
    registerReceiver(mTestReceiver, intentFilter); 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 

    return null; 
} 

public BroadcastReceiver mTestReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Event triggered--------", Toast.LENGTH_SHORT).show(); 
    } 
};} 

但是當設備被插入/拔出我沒有拿到敬酒。我試圖直接從活動中調用這個廣播接收器,它工作。但內部服務不起作用。我對服務不太瞭解。請建議解決方案

在此先感謝。

+0

的onCreate會只需調用一次,所以它會執行一次..每當有客戶端調用startService()或bindService()時,服務將返回可用的綁定器,這意味着下一次不會再次執行onCreate()..因此,對於您的情況這個吐司只顯示了一次 –

+0

你在你的androidmanifest.xml中添加了你的服務嗎? –

回答

2

如果你只想做一次,那麼你的邏輯就沒問題。

onCreate只會調用一次,所以它會執行一次。每當有客戶撥打startService()bindService(),那麼該服務將返回可用的活頁夾並調用onServiceConnected()回叫。

這意味着下一次它不會再次執行onCreate(),因此對於您的情況,此toast只顯示一次。

所以onStartCommand()onBind()將直接調用每當用戶試圖呼籲startService()bindService()

或者,如果你想,只要你的服務連接到顯示敬酒,那麼你需要做的無論是在onStart()onBind()

+0

我甚至沒有得到至少一次吐司。我已經嘗試使用onStart()。沒有任何區別 –

+0

我不確定你的意思是它只被調用過一次......每當一個服務實例不存在時就調用它,例如'onDestroy'被稱爲https://developer.android.com/guide /components/services.html#LifecycleCallbacks – Ryan

+0

絕對,這是內在的含義..如果onDestroy()調用意味着肯定onCreate()將調用.. supose onStartCommand執行,這並不意味着onDestroy()將盡快調用。 如果我們綁定了服務,那麼當所有的客戶端都刪除它與服務的連接時,onDestroy()將會調用。 –

0

我想這是因爲你有錯誤的情況下,嘗試使用getApplicationContext()

+0

對不起。它不工作 –

+0

感謝您的時間@Ryan –

相關問題