当应用程序未运行时,小米手机将无法收到通知。

40
我正在开发一个应用程序,其中我使用了Google推送通知。当应用程序在小米手机上运行时,它会接收到通知。但是,当应用程序被关闭时,它就无法接收到通知。
如果我们希望在应用程序被关闭时仍然能够接收到通知,那么我们需要手动允许从小米的安全应用中自动重新启动应用程序。我想知道是否有办法以编程的方式做到这一点,而不需要询问用户。是否有办法实现这个目标?

Enter image description here

http://en.miui.com/thread-33826-1-1.html


它在其他供应商设备上正常工作。 “你尝试过什么?” -- 我只在stackoverflow上查找并附上链接,但没有找到任何解决方案。如果您有解决方案,请分享,否则写这样的评论毫无意义。我不认为这是重复的问题。 - N Sharma
你的手机上有Google框架吗? - Mine
1
@Williams,我认为你的问题是这样的:“我想要任何程序化的技巧来完成这个操作,而不需要询问用户。有没有办法做到这一点?”对于这个问题,我的陈述仍然有效。 - Abhinav Gauniyal
@我的 手机是小米的。 - N Sharma
7
问题是,我仍然收到来自Facebook和WhatsApp的通知。他们有何不同之处? - Darpan
显示剩余5条评论
4个回答

12
https://www.cricketbuddies.com/cricket/world-cricket-championship-2/guides/wcc2-guides的"游戏通知修复"部分:
在小米手机上,有五个设置需要手动进行,以便正确运行任何应用程序。我已经对此进行了大量研究,没有办法通过编程来修复这些设置。以下是这些设置: 1. 自动启动 -> 打开(切换并重新启动您的应用程序) 2. 开发者选项下的MIUI优化 -> 关闭 3. 开发者选项下的内存优化 -> 低/关闭 4. 电池和性能设置中没有对后台活动的限制 5. 省电模式 -> 关闭
在其他许多设备上,也需要手动进行设置,以便应用程序按预期工作,例如联想和一些Micromax设备。公司对后台活动施加此类限制是为了提高整体电池寿命。一些应用程序,如Facebook和WhatsApp,可能已被包含为系统应用程序,因此可以正常工作。

谢谢,我刚在我的小米手机上测试了MIUI全球版9.1,现在我的Intent Services正常工作了! - Saul_programa
这完全是从WCC2指南整体剽窃过来的。换句话说,原帖没有一个独立的字眼。 - Peter Mortensen

6

MIUI 6和7之后:

MIUI省电模式默认设置为“标准”(将限制后台访问位置服务和网络)

如何设置:

设置 -> 其他设置 -> 电池和性能 -> 管理应用电池使用情况 -> 省电模式 -> 设置为关闭(MIUI不会限制后台活动)


3
一旦您在“最近使用的应用程序”菜单中清除应用程序或清除内存,小米(或MIUI ROM)将强制关闭与该应用程序相关的所有服务和内存,类似于用户前往设置并强制停止应用程序。 此链接讨论了同样的问题,因此除非用户再次启动,否则所有广播接收器和服务都将结束,因此无法收到通知。但是,您可以尝试在设置中仅为您的应用程序权限启用“自动启动”。如果仍然不起作用,请尝试创建可自行重启并在设置中启用“自动启动”的服务。在MIUI中,“自动启动”非常重要,直到启用它之前,所有通知或应用程序活动都将被强制关闭,并且永远不会启动。

如何创建一个可以自动重启的服务? - Manikanta
1
你可以用多种方式来实现,首先尝试使用START_STICKY,这样如果服务被系统结束,它会尝试重新创建服务,或者只需监听服务的onDestroy并尝试重新启动。 - Ujju
@SudhanshuGaur 不,如果在“自启动”中未启用,则不会运行任何后台服务,默认情况下,所有新安装的应用程序都处于禁用模式。但是,一些流行的应用程序(如FB和WhatsApp)在安装时默认启用,但您仍然可以手动禁用它们并进行测试,它们将不再接收任何消息。 - Ujju
1
是的,我已经知道了,我想问的是FB或WhatsApp编写了什么代码,以便他们的应用程序默认安装具有“自启动”选项。 - Sudhanshu Gaur
@SudhanshuGaur 要么ROM已经自行将一些非常常见的应用程序列入白名单,而无需FB编写任何代码;要么MIUI没有提供任何自己的SDK来控制其自定义设置,我会选择后者。 - Ujju
显示剩余4条评论

0

我曾经遇到过类似的问题,通过在我的应用程序中添加BOOT_COMPLETED接收器来解决它。

请将以下内容添加到清单中:

<receiver
    android:name=".receivers.BootReceiver"
    android:enabled="true">
    <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

然后创建您的BootReceiver类

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {

            Intent startServiceIntent = new Intent(context, FBTokenService.class);
            context.startService(startServiceIntent);

            Intent notificationServiceIntent = new Intent(context, FBNotificationService.class);
            context.startService(notificationServiceIntent);
        }
    }
}

它应该可以与此一起工作。


这在混合应用程序上是如何工作的 - 例如使用Cordova? - Rodney
@Rodney,你可以尝试编写一个本地的 Cordova 插件,这只是一个想法。 - Allan Nienhuis

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