重启接收器在小米手机上没有作用。

25

你好,我们正在开发一款Android应用程序,在其中使用了重新启动接收器,在其中启动了一些服务,执行一些网络操作。

我发现在某些Android设备上(如小米等),重新启动接收器不起作用。

以前我知道在HTC设备上也不起作用,所以我添加了一个更多的意图过滤器 <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 然后它开始正常工作。现在其他手机如小米仍然不能工作。

我还需要设置什么以使其在所有设备上都能正常工作而不需要用户手动更新任何设置。

<receiver
    android:name="com.xyz.broadcastreceiver.ServiceStarter"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

预先感谢。


QUICKBOOT_POWERON 可能是问题所在,这仅适用于某些设备.....删除它并重试... - Opiatefuchs
@Opiatefuchs 如果我在意图过滤器中指定了两个动作,那么这是否意味着两个动作都必须触发此事件? - N Sharma
@Opiatefuchs 请看这个链接 https://dev59.com/qnvaa4cB1Zd3GeqPFqBN#21294637 - N Sharma
我不是很确定,意图过滤器中可以执行多个操作,但从API的角度来看: “创建包含多个<action>,<data>或<category>实例的过滤器是可以的。如果这样做,您只需要确保组件能够处理所有这些过滤器元素的任何组合。”.. 就我的理解而言,这意味着,如果设备不能处理其中一个,它就无法处理整个意图。所以只需将其分开并制作两个接收器... - Opiatefuchs
你看过这个网址吗:https://dev59.com/zlsV5IYBdhLWcg3w2h0s? - zeeali
10个回答

10

小米手机运行MIUI系统自带启动应用程序拦截器,可能会干扰您的开机广播接收器。


1
作为应用程序开发人员,你真的无能为力。这是一个操作系统级别的设置。 类似的设置可以在任何已root的设备上使用一些应用程序,如Rom Toolbox等。 链接但是,如果你在启动阻止器中将你的应用程序列入白名单,它仍然可以工作。 - Sanket Berde
有没有办法禁用它? - milosmns
作为应用程序开发者你无能为力。 - Sanket Berde
三星SHealth在小米手机重启后如何启动其服务? - Bilal Bangash

7

好的,让我们再试一次。MIUI有一个内置的安全应用程序。在安全应用程序中,有一个“启动”部分,用户可以配置哪些应用程序可以启动,哪些应用程序不能启动。您的应用程序默认被禁用。此外,如果您检查Logcat,您会看到在启动时出现“权限被拒绝”的消息。 将您的应用程序手动添加到白名单应用程序中,不幸的是,只有您的用户能够这样做。


5
MIUI内部有一个功能,可以防止应用程序为了节省电池和RAM而重新启动。您必须手动切换自动启动选项才能接收BOOT_COMPLETED广播。前往设置>已安装的应用程序>您的应用程序。然后只需打开自动启动选项即可。没有程序化地防止这种情况的选项。相反,您可以告知您应用程序的用户,如果他们在使用您的应用程序时遇到问题(例如:闹钟不正确触发),可以从设置中启用自动启动。

enter image description here


4

在intent-filter中的清单文件中添加以下内容:

<action android:name="android.intent.action.BOOT_COMPLETED" />

2
它已经在那里了 <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> 或者你说的是其他事情? - N Sharma
为什么这个答案有50多个声望?它在MIUI中并不是一个解决方案。 - Saurabh Kumar

4
尝试添加 android.intent.category.DEFAULT 类别。对于隐式意图来说,它是必需的,但是在小米手机中可能会进行某些调整,导致意图未经过其中一个测试而无法被您的应用程序接收。

@droiddl 这是一个有趣的假设。你是怎么想到的呢?请提供任何逻辑证明它的理由。或者也许有人确切知道吗? - Johnny Five
1
事实是,如果没有收到意图,则帖子中提到的测试不会通过,这就是意图框架的工作原理。某些设备之所以会通过测试,而另一些则不会,原因很简单,两个操作系统的工作方式并不相同。操作系统由OEM进行定制,因此如果在“原生”安卓中它可以工作,在小米中不能工作,那么问题就出在定制上。 - droidpl

3
您需要添加

标签。

android:enabled="true"

并且。
android:exported="true"

exported可以为false,但必须包含exported。

我认为这是ROM Xiaomi.eu的问题,在开发版本上进行了测试,我在小米红米Note 2 Prime上使用了MIUI 6.5.19 Beta版本7.4。由于服务器维护原因,我还没有检查过稳定版本是否可下载。广播接收器在启动时无法工作。

在小米Mi 4上探测相同的应用程序,使用稳定的小米全球ROM,MIUI 7.1.2,在管理器中激活自启动后,完美地工作。重启后,广播接收器和所需权限都能正常工作。

现在,我在Xiaomi.EU 7.3稳定版,MIUI 7.3.2上进行了测试,在启动和重新启动时广播接收器都能正常工作。我在安全管理器中注册了我的接收器,并且在ROM开发版本中它无法工作。我没有测试过小米官方ROM全球开发版。

我的权限:

<receiver android:name=".service.BootBroadcastReceiver"
  android:enabled="true"
  android:exported="true">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    <action android:name="android.intent.action.REBOOT"/>
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</receiver>

你有任何解决方案吗?我发现在Mi4i上,“定时关机/开机”不会发送BOOT_COMPLETED。 - Alexey Subbota
我发现使用稳定版本可以解决这个问题。 - Arturo De Casso

3

小米手机报告了一个错误,即只有在系统实际启动后的5分钟内使用此接收器 -
http://xiaomi.eu/community/threads/alarmmanager-_wakeup-problem.21430/
您可以尝试添加 -

android:enabled ="true"android:exported ="true"
尽管由于制造商系统更改,它们应该默认设置为true,
但在小米安卓定制操作系统上可能会有所不同。
只需注意其含义
由于 android:exported =“true”
将允许其他应用程序访问您的接收器。


这句话的意思是“系统启动5分钟后,该接收器会发生什么?” - N Sharma
基本上,接收器是注册到系统服务的对象,该服务负责通过小米定制的操作系统中的某些参数进行通知,它们可能只在验证了某些事情(如电池电量等)之后才这样做,不过我只是猜测。 - CrazyPixel

1
你应该在这里看到这里。在小米设备上,即使你需要某些权限,他们也会阻止一些权限。唯一解决的方法是手动允许你的应用程序获得此权限。

0

我建议添加android:enabled="true",但已经提供了。

所以我可以告诉你,你首先要确定接收器是否正确注册。你也可以尝试另一种注册方式 - 即在程序中进行注册(最好在onPause()和onResume()中),看看它是否接收到广播消息。


0

尝试从开发者选项中禁用MUIU优化。这对我有用。

1- 进入设置

2- 打开其他设置

3- 打开开发者选项

4- 找到打开MIUI优化

5- 关闭开关按钮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接