Android - 推送通知是否开启?

时间:2013-06-04 08:01:50

标签: android push-notification application-settings

如果用户在应用设置中关闭推送通知,如何以编程方式检查? 我可以直接从应用程序打开应用程序设置意图,以提示用户打开它吗?

enter image description here

由于

2 个答案:

答案 0 :(得分:8)

假设您指的是Google Cloud Messaging(因为您使用的是android和push-notification标记),则没有用于启用/禁用GCM服务的常规设置(与iOS设备的Apple推送通知服务不同)。

当您安装应用时,如果该应用使用Google Cloud Messaging,它将列在此应用为了工作所需的权限列表中。通过选择安装应用程序,您可以向其发送推送通知。

也就是说,为了让应用程序实际接收GCM消息,您的应用程序必须以编程方式注册到GCM服务。您可以在应用程序中的任何位置执行此操作,并且可以创建用户可以启用/禁用GCM的app settings活动(或片段或其他)(这将触发注册/取消注册到GCM )。您的应用程序可以包含一个持久存储,该存储将保存您在注册GCM时收到的注册ID,并且您可以使用该存储来确定您的应用是否已注册到GCM。

如果应用程序已在运行,您可以让用户将其打开(如果您有一些代码可以执行此操作)。如果它未运行且该设备上的GCM未注册该应用程序,则您的服务器无法向其发送GCM消息。

如果您想克服这个障碍,您可以自动注册到GCM(首次启动应用程序时)。然后,您可以随时向应用程序发送消息。如果您仍想让用户决定是否要查看这些通知,您可以在应用设置中设置一个标志,以启用/禁用由于传入的GCM消息而创建的UI通知。 GCM服务将始终启用,但除非用户选择查看通知,否则当应用GCM消息时,您的app将不会显示任何内容。

答案 1 :(得分:3)

除非您声明系统进程或具有root权限,否则无法访问此属性,首先您可以看到file:/data/system/notifycaiton_policy.xml的权限:-wr ------。

另请参阅以下源代码:/android/4.2/frameworks/base/services/java/com/android/server/NotificationManagerService.java。在api:public void setNotificationsEnabledForPackage(String pkg, boolean enabled)中,会检查来电者的UID是否为Process.SYSTEM_UID

void checkCallerIsSystem() {
    int uid = Binder.getCallingUid();
    if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
        return;
    }
    throw new SecurityException("Disallowed call for uid " + uid);
}