您好我已经制作了一个带接收器的应用来收听来电,
我的问题是,当我关闭(从应用列表中滑出)时,接收器不再工作了。
我试过的第一件事是接收器本身在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中启动它,它打印日志,它的工作原理! 没有服务的任何方式使这项工作我害怕电池问题等等?谢谢!
答案 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的首选模式,并仅使用性能调优来使您的代码尽可能高效。服务绝对不是免费的,但只要一个人启动并运行它们就不会自动成为重物;加上他们确实存在这个目的。只要记住不要在你的服务中做不必要的工作,你应该从正确的开始。