当力关闭时,接收器停止

时间:2017-10-30 17:29:54

标签: android android-broadcastreceiver

您好我已经制作了一个带接收器的应用来收听来电,

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

我试过的第一件事是接收器本身在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>

仅当应用程序处于打开状态或处于后台时才有效。

我在网上看到了这一点 - https://stackoverflow.com/a/46889335/7079340 所以我这样做了一个自己的服务(在清单中):

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

在我的Splashscreen的oncreate中启动它,它打印日志,它的工作原理! 没有服务的任何方式使这项工作我害怕电池问题等等?谢谢!

2 个答案:

答案 0 :(得分:1)

当您关闭应用时,它会直接转到a = [1, 2, 2, 3, 3] occurrences = a.inject(Hash.new(0)){ |h, el| h[el] += 1; h } # => {1=>1, 2=>2, 3=>2} max_occurences = occurrences.max_by{ |_, v| v } # => [2, 2] max_occurences.count > 1 ? false : occurrences.key(max_occurences.first) 方法。在您的服务代码中,您实现了此方法。因此,在您的方法中,您确实以编程方式停止了您的服务。简而言之,您必须将其删除。

答案 1 :(得分:1)

Android已经从Marshmallow及其上方进行了许多更改,这些更改隐含了在其清单中监听广播的应用。这样做的原因是因为几个应用程序将注册广播,并且将为所有注册的应用程序的广播接收器运行新的过程(非常昂贵),从而导致电池耗尽。更糟糕的是,用户无法控制此行为,因为广播接收器无法取消注册。为了解决这个问题,Android背后的工程团队只允许隐式注册少数几个广播。一个是设备启动广播意图。通过阻止应用程序隐式注册广播,用户必须手动启动应用程序以收听他们想要通知的意图。这可以防止几个不必要的应用程序被唤醒以尝试处理意图。

关于你的关注,关于&#34;电池问题&#34;我建议您使用在您的服务中明确注册BroadcastReciever的首选模式,并仅使用性能调优来使您的代码尽可能高效。服务绝对不是免费的,但只要一个人启动并运行它们就不会自动成为重物;加上他们确实存在这个目的。只要记住不要在你的服务中做不必要的工作,你应该从正确的开始。