当前位置: 首页 > 知识库问答 >
问题:

Android取消注册接收,但仍在接收

韶云瀚
2023-03-14

我已经在创建服务方法上注册了接收者,并在销毁方法上取消注册?它工作得很好,但在某些三星Galaxy s3上,即使我停止服务,我仍然会收到接收器。如何找到解决办法?有可能吗?请帮帮我.提前致谢

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);
    }
};

}

共有1个答案

夏博
2023-03-14

ondestroy()中调用unregisterreceiver(...)不是一个好主意,因为并不总是保证可以调用它。

来自官方文件

在销毁活动之前执行任何最终清理。这可能是因为活动正在完成(有人在它上面调用了finish(),也可能是因为系统暂时销毁了活动的这个实例以节省空间。您可以使用isFinishing()方法来区分这两种情况。

    null

好的,所以刚刚从@commonsware中找到了这个答案,它说服务ondestroy()在某些情况下不会被调用,如下:

>

  • 如果用户强制阻止您使用设置应用程序

    如果Android在匆忙中需要RAM(例如,处理一个来电),并选择终止您的进程以释放该RAM

  •  类似资料:
    • 我在OnReceive()方法中使用smsmsmanager发送消息,我想为smsmsmanager添加发送和传递报告意图,当我通过编程和清单在另一个接收方中注册接收方时,它不会调用发送的sms接收方。 是否可以在onReceive()中执行,或者帮助我实现这一点?

    • 我是android新手。我的项目有一个活动和一个服务。我的服务有一个广播接收器,而活动有一个广播发送器,它在PeriodSender方法中。动态地,当我注册接收者时,在服务开始时它不会调用,但是如果我在几分钟后发送了一些东西,它就会调用。但是我想在清单中注册它,我已经在清单中包含了接收方的详细信息,但是接收方没有调用。我的接收方类名是MyReceiver21,意图操作是My_ACTION1。实际上

    • 如果可以的话,请帮我一下。我一直试图实现一个基本的gcm设置。在服务器端,我使用了上面答案中的php代码——GCM和PHP (Google Cloud Messaging ),在客户端,我遵循了Google的GCM教程。整个事情在我的Nexus 4上运行良好,但在我试过的两款4.0.4之前的设备上就不行了。一个是运行4.0.3的htc one v,一个是运行2.3.4的索尼爱立信。这可能是关于4.

    • 在将Spark 1.6应用程序移植到Spark 2.0.2的过程中,日志中出现了以下投诉: 此操作失败,原因是:java。lang.ClassNotFoundException:org/apache/spark/streaming/receiver/receiver[]/类 此操作失败,原因是:java。lang.ClassNotFoundException:org/apache/spark/st

    • 我有1个活动和1个普通类,其中活动1接收消息,普通类发送消息。如何实施: 在活动一中。班 在Ordinary.class 如何发送空消息(1)的代码?

    • 我已经实现了这样的接收器(在清单文件中) 如果电话的状态改变,则调用记录器广播接收器。一切都很好。但是,如果我重新启动设备,接收器永远不会被调用,直到我运行我的应用程序。 我需要在启动后注册(不调用)这个接收器。 许多感谢, [编辑] 我通过向清单文件添加以下接收者解决了这个问题 不过,我没有在java代码中注册RecorderBroadcastReceiver。我只加了上面的接收器。这意味着从应