我有一个使用NotificationListenerService的应用程序。它可以在低于Android Oreo的api上完美运行,但是特别是在Android Oreo上,当用户重新启动应用程序时,该系统似乎无法启动该服务(在用户首次授予许可的那一刻它就可以工作),即使权限已被授予。具体来说,我在StackOverflow上找不到任何解决方案。



Android清单

<service android:name=".Services.MyCustomNotificationListener"
android:label="MyAppName"
android:exported="true"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
    <action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>

最佳答案

好的,这没有经过良好测试。我只是想把它扔在那里,希望能帮助其他遇到同样问题的人。看来您必须使用onListenerConnected和getActiveNotification()来使OREO设备接收通知。这是我的代码:

public class ListenForNotificationsService extends NotificationListenerService {

    private String TAG = this.getClass().getSimpleName();

    @Override
    @TargetApi(Build.VERSION_CODES.N)
    public void onListenerConnected() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            getActiveNotifications();
        }
        Log.d(TAG, "Listener connected");
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {

        Log.d(TAG, "Notification received");
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {

        if (sbn.getPackageName() != null) {

            Log.d(TAG, "Notification removed:" + sbn.getPackageName() + ":" + sbn.getId());
        }
    }

    @Override
    @TargetApi(Build.VERSION_CODES.N)
    public void onListenerDisconnected() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // Notification listener disconnected - requesting rebind
            requestRebind(new ComponentName(this, NotificationListenerService.class));
        }
    }
}


请注意,我不知道onListenerDisconnected()是否正确或什至是必需的,请谨慎使用。还有一个想法是,由于OREO中的DEEP SLEEP发生了变化,可能还需要其他方法来处理它。 YMMV,这只是浪费了我很多时间,所以希望它将对其他人有所帮助。

07-25 23:58