强制关闭时接收器停止

Receiver stops when force close

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

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

我尝试的第一件事是在 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>

这仅在应用程序打开或在后台时有效。

我在网上看到了这个 - 所以我自己做了一个服务(在清单中):

<service android:name=".Service.CallService" android:enabled="true"
    android:exported="false"> <intent-filter>
    <action android:name="com.package.name.IRemoteConnection" />
</intent-filter>
</service>

和 class :

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

在我的 Splashscreen 的 oncreate 中启动它,它打印日志并且它工作! 有什么方法可以在没有服务的情况下使这项工作我担心电池问题等等?谢谢!

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

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

至于您的顾虑,关于 "battery issues" 我会建议您使用在您的服务中显式注册 BroadcastReciever 的首选模式,并仅进行性能调整以使您的代码尽可能高效。服务绝对不是免费的,但它们不会仅仅通过启动和 运行ning 就自动成为重物;另外,它们确实是为了这个确切的目的而存在的。请记住不要在您的服务中做不必要的工作,您应该有一个正确的开始。