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