2016-04-21 38 views
2

我已註冊onCreate方法的服務的接收器,並取消註冊onDestroy?它完美的工作,但在某些三星Galaxy S3我仍然recive接收器,即使我停止服務。如何找到解決方案?可能嗎?請幫幫我。在此先感謝Android註銷接收器,但仍然收到

package com.sms.sendsms.service; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import java.util.ArrayList; 

/** 
* Created by Navruz on 30.03.2016. 
*/ 
public class SendSmsService extends Service { 

private static Logger LOGGER = LoggerFactory.getLogger(SendSmsService.class); 

@Override 
public void onCreate() { 
    super.onCreate(); 
    LOGGER.info("Service is onCreate"); 
    registerReceiver(incomingCallReceiver, new IntentFilter(
      TelephonyManager.ACTION_PHONE_STATE_CHANGED)); 


} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    LOGGER.info("Service is onStartCommand"); 

    return START_STICKY; 

} 


@Override 
public void onDestroy() { 
    super.onDestroy();   
    unregisterReceiver(incomingCallReceiver); 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

private BroadcastReceiver incomingCallReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     LOGGER.info("IncomingCallReceiver is received."); 
     TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
     telephony.listen(new PhoneStateListener() { 
      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       super.onCallStateChanged(state, incomingNumber); 
       LOGGER.info("state : " + state); 

      } 
     }, PhoneStateListener.LISTEN_CALL_STATE); 
    } 
}; 

}

+0

您可以發佈您的代碼? –

+2

Uraaaaa :)))))))))我找到了解決方案。問題是telephony.listen(新的PhoneStateListener(),..)不reciver。我所需要做的就是telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE); onDestroy方法。 – nAkhmedov

回答

0

這不是一個好主意,打電話unregisterReceiver(...)onDestroy()因爲它不是總是保證被調用。

Official Documentation

活動被銷燬之前執行任何最後的清理。這可能是因爲活動正在完成(有人稱爲 finish(),或者因爲系統暫時銷燬此活動的實例以節省空間,您可以使用isFinishing()將這兩個方案區分爲 方法

注:以上不依靠此方法被稱爲一個地方保存 數據例如,如果一個活動是在內容 提供商編輯數據,這些修改應該在任何的onPause承諾( )或 onSaveInstanceState(Bundle),這裏沒有。這個方法通常實現了 來釋放像線程這樣的資源這些活動與 活動相關聯,以便在應用程序的其餘部分仍在運行時,被銷燬的活動不會離開 。有 情況下系統將簡單地殺死活動的主機 進程而不調用此方法(或任何其他人),因此它不應該用於在過程消失後將其保留在 左右。

參考文獻:

  1. Android Activity onDestroy() is not always called and if called only part of the code is executed
  2. Is ondestroy not always called?

編輯

好了,所以剛剛發現this answer從@CommonsWare它說,ServiceonDestroy()不會得到所謂的在某些情況下,如:

  • 如果用戶強制停止從設置應用

  • 如果Android的需求內存匆忙(例如,處理傳入的電話 電話),並選舉終止您的進程騰出RAM

  • 您從DDMS終止進程

  • 另外,如果您的服務崩潰與未處理的異常的地方, 的Android可考慮的服務是解散並跳過onDestroy()

我猜你要麼力停止Service或設備運行LO RAM上;因此onDestroy()未被調用。

+0

銷燬方法調用我可以看到所有日誌。 – nAkhmedov

+0

是的,因爲大部分時間被稱爲。但不總是**。 – camelCaseCoder

+0

Even Servise還沒有onPause方法?你有沒有在服務中使用過接收器? – nAkhmedov

0

如果您在某些設備上遇到問題,可以嘗試顯式禁用接收器組件。無論清單中指定了什麼,這都會執行相同的操作。

廣播接收器類

public class Reg extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // your stuff 
    } 
} 

稱此爲的onDestroy()

ComponentName comp = new ComponentName(this,"com.example.Reg"); //package name,broadcast receiver class path 
PackageManager pkg = this.getPackageManager(); 
pkg.setComponentEnabledSetting(comp,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); 

內容添加到manifest文件

<receiver android:name="com.example.Reg" /> 

COMPONENT_ENABLED_STATE_DISABLED

ENABLING DISABLING BROADCAST RECEIVER DURING RUNTIME

0

我有一個解決方案,它爲我工作:

/** 
* if service is going to destroy, unregister broadcast receiver by main activity context. 
*/ 
@Override 
public void onDestroy() { 
Log.e(TAG, ">>>>>UEventObserverService.onDestroy()"); 
getApplicationContext().unregisterReceiver(screen_state_receiver); 
super.onDestroy(); 
} 
相關問題