2016-11-21 122 views
0

我正在實施一個名爲Clipboard.class的服務,當用戶複製/剪切某些內容時會彈出一個意圖。點擊按鈕後,我運行並停止MainActivity.java的服務。安卓服務不會停止

@OnClick(R.id.btn) 
public void runService() 
{ 
    Intent service = new Intent(this, Clipboard.class); 
    run = Clipboard.running == 1 ? true:false; 
    if(!run) 
    { 
     startService(service); 
     btn.setText("Tap to stop"); 
    } 
    else 
    { 
     stopService(service); 
     btn.setText("Tap to run"); 
    } 
} 

,這是我的服務Clipboard.class

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    running = 1; 
    Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show(); 
    mCM = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
    mCM.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() 
    { 
     @Override 
     public void onPrimaryClipChanged() { 
      String newClip = mCM.getText().toString(); 
      Toast.makeText(getApplicationContext(), newClip.toString(), Toast.LENGTH_LONG).show(); 

      Intent dialogIntent = new Intent(Clipboard.this, ShareTo.class); 
      dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(dialogIntent); 
     } 
    }); 
    return mStartMode; 
} 

@Override 
public void onDestroy() 
{ 
    running = 0; 
    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show(); 
    super.onDestroy(); 
} 

一切工作正常,當我點擊停止按鈕只有服務不會停止,爲什麼呢?我可以告訴服務不會停止,因爲在我停止服務之後,當我複製某些內容時,意圖仍然會彈出。

+0

你不刪除原始片段更改偵聽器。這實際上是一個內存泄漏。 – DeeV

+0

@DeeV我嘗試在'onDestroy()'中將它設置爲null,但是我得到了'NullPointerException' – Newbie

+1

保存對使用'addPrimaryClipChangeListener'放入的Listener的引用,然後使用'removePrimaryClipChangedListener(ClipboardManager.OnPrimaryClipChangedListener) ' – DeeV

回答

0

從在這一點上谷歌文檔Android Service

該服務將繼續運行,直到Context.stopService()或stopSelf()被調用。

所以使用這樣

Intent service = new Intent(this, Clipboard.class); 
run = Clipboard.running == 1 ? true:false; 
if(!run) 
{ 
    startService(service); 
    btn.setText("Tap to stop"); 
} 
else 
{ 
    context.stopService(service); 
    btn.setText("Tap to run"); 
}