2016-04-21 123 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(); 
} 
相关问题