Android 强制关闭时接收器停止

Android 强制关闭时接收器停止,android,android-broadcastreceiver,Android,Android Broadcastreceiver,你好,我制作了一个应用程序,带有一个接收器,可以接听来电 我的问题是,当我关闭(从应用程序列表中注销)时,接收器不再工作 我尝试的第一件事是android清单中定义的接收器本身,如下所示: <receiver android:name=".demo.CallReceiver" android:exported="true" android:enabled="true"> <inten

你好,我制作了一个应用程序,带有一个接收器,可以接听来电

我的问题是,当我关闭(从应用程序列表中注销)时,接收器不再工作

我尝试的第一件事是android清单中定义的接收器本身,如下所示:

<receiver
            android:name=".demo.CallReceiver"
            android:exported="true"
            android:enabled="true">
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

            </intent-filter>
        </receiver>
在我的Splashscreen的oncreate中启动了它,它打印日志,并且工作正常!
有没有办法在没有服务的情况下工作我担心电池问题等等?谢谢

当您关闭应用程序时,它将直接转到
ondestory
方法。在服务代码中,您实现了此方法。因此,在您的方法中,您确实以编程方式停止了服务。简而言之,您必须删除它

当您关闭应用程序时,它将直接转到
ondestory
方法。在服务代码中,您实现了此方法。因此,在您的方法中,您确实以编程方式停止了服务。简而言之,您必须删除它

Android在Marshmallow和更高版本中对应用程序进行了许多更改,这些应用程序在其清单中隐式侦听广播。其原因是,有几个应用程序将注册进行广播,并且会启动一个新的进程,让所有注册应用程序的广播接收器运行(非常昂贵),从而导致电池耗尽。更糟糕的是,用户无法控制这种行为,因为无法注销广播接收器。为了解决这个问题,Android背后的工程团队只允许隐式注册少量广播。一个是设备引导广播意图。通过阻止应用程序隐式注册广播,用户必须手动启动应用程序,以监听他们希望得到通知的意图。这可以防止一些不必要的应用程序被唤醒以尝试处理意图


至于您所关心的“电池问题”,我建议您使用首选模式,在您的服务中显式注册一个BroadcastReceiver,并进行性能调整,以使您的代码尽可能达到最佳性能。服务绝对不是免费的,但它们并不是仅仅通过启动和运行一个服务就自动成为沉重的负担;此外,它们确实是为了这个目的而存在的。记住不要在你的服务中做不必要的工作,你应该有一个正确的开始。

安卓已经从Marshmallow和更高版本开始对应用程序进行了很多更改,这些应用程序在其清单中隐式侦听广播。其原因是,有几个应用程序将注册进行广播,并且会启动一个新的进程,让所有注册应用程序的广播接收器运行(非常昂贵),从而导致电池耗尽。更糟糕的是,用户无法控制这种行为,因为无法注销广播接收器。为了解决这个问题,Android背后的工程团队只允许隐式注册少量广播。一个是设备引导广播意图。通过阻止应用程序隐式注册广播,用户必须手动启动应用程序,以监听他们希望得到通知的意图。这可以防止一些不必要的应用程序被唤醒以尝试处理意图


至于您所关心的“电池问题”,我建议您使用首选模式,在您的服务中显式注册一个BroadcastReceiver,并进行性能调整,以使您的代码尽可能达到最佳性能。服务绝对不是免费的,但它们并不是仅仅通过启动和运行一个服务就自动成为沉重的负担;此外,它们确实是为了这个目的而存在的。请记住不要在您的服务中做不必要的工作,您应该有一个正确的开始。

是的,我编辑了我的问题,删除了ondestroy,它就可以工作了,但我担心保持服务始终打开的成本,有没有其他方法可以做到这一点?我认为,您必须在必要之前停止服务。例如,如果你想监听短信以保存和存储它们(可能在你的应用程序中发出一些通知,如whatsapp),你可以保持打开状态,但如果你想在应用程序运行时使用该服务,你可以在应用程序关闭时停止该服务。此外,假设你需要一些值来运行服务,当这些值为空时,你将得到“您的应用程序已停止“我一直在发短信。我在我的一些后台应用程序中有过这样的经历。基本上,我想做的是在打电话时打开一个web浏览器,我该怎么做,该服务必须一直处于打开状态?是的,我编辑了我的问题,删除了ondestroy,它可以正常工作,但我担心保持服务一直处于打开状态的成本,还有别的办法吗?在我看来,你必须在必要时停止服务。例如,如果你想监听短信以保存和存储它们(可能在你的应用程序中发出一些通知,如whatsapp),你可以保持打开状态,但如果你想在应用程序运行时使用该服务,你可以在应用程序关闭时停止该服务。此外,假设你需要一些值来运行服务,当这些值为空时,你将得到“您的应用程序已停止“我一直在发短信。我在我的一些后台应用程序中有过这样的经历。基本上,我想做的是在打电话时打开一个web浏览器,我该怎么做,该服务必须一直处于打开状态?是的,我编辑了我的问题,删除了ondestroy,它可以正常工作,但我担心保持服务一直处于打开状态的成本,还有别的办法吗?是的,我编辑了我的问题,删除了ondestroy,它可以正常工作,但我担心一直开放服务的成本,还有别的办法吗?答案很好,新安卓8呢,这项服务可以吗?@yanivtwin是的,安卓8的服务可以。回答得好,新安卓8怎么样,这项服务可以吗?@yanivtwin是的,安卓8的服务可以。
<service android:name=".Service.CallService" android:enabled="true"
    android:exported="false"> <intent-filter>
    <action android:name="com.package.name.IRemoteConnection" />
</intent-filter>
</service>
public class CallService extends Service {
    private static BroadcastReceiver m_Receiver;

    @Override
    public IBinder onBind(Intent arg0)
    {
        Log.e("SERVICELOG","bind");

        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("SERVICELOG","start command");

        return START_STICKY;
    }

    @Override
    public void onCreate()
    {
        Log.e("SERVICELOG","create");

        Receiver();
    }

    @Override
    public void onDestroy()
    {
        Log.e("SERVICELOG","destroy");
        try{
            unregisterReceiver(m_Receiver);}catch (Exception e){
            Log.e("SERVICELOG"," "+e.getMessage());

        }

    }

    private void Receiver()
    {
        m_Receiver = new CallReceiver();
    }
}