android - 扩展 NotificationListener 的服务永远不会启动

标签 android android-service android-manifest notification-listener

我在实现通知监听器时遇到问题。基本思路是想改变手机的静音模式,但是目前连相关的函数(onStartCommand)都没有被调用。使手机静音的方法是调用 enableSilentMode() 方法,该方法在内部发送 Intent 广播,由 getInterruptionFilterRequestIntent() 方法构建。

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class SilentModeService extends NotificationListenerService {
    public static int CURRENT_FILTER;

    public static final String ACTION_REQUEST_INTERRUPTION_FILTER =
            SilentModeService.class.getPackage().getName() + '.' + "ACTION_REQUEST_INTERRUPTION_FILTER";
    public static final String EXTRA_FILTER = "filter";

    public SilentModeService() { super();
        CURRENT_FILTER = getCurrentInterruptionFilter();
    }

    public static Intent getInterruptionFilterRequestIntent(Context context, final int filter) {
        Intent request = new Intent(ACTION_REQUEST_INTERRUPTION_FILTER);
        request.setComponent(new ComponentName(context, SilentModeService.class));
        request.setPackage(context.getPackageName());
        request.putExtra(EXTRA_FILTER, filter);
        return request;
    }

    /** Convenience method for sending an {@link android.content.Intent} with {@link #ACTION_REQUEST_INTERRUPTION_FILTER}. */
    private static void requestInterruptionFilter(Context context, final int filter) {
        Intent request = getInterruptionFilterRequestIntent(context, filter);
        context.sendBroadcast(request);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("SilentModeService", "Received start id " + startId + ": " + intent);
        Crashlytics.log(Log.INFO, "SilentModeService", "Requested new filter. StartId: " + startId + ": " + intent);

        return super.onStartCommand(intent, flags, startId);
    }

    public static void enableSilentMode(Context context)
    {
        requestInterruptionFilter(context, INTERRUPTION_FILTER_NONE);
    }

    public static void switchToFilter(Context context, int filter)
    {
        requestInterruptionFilter(context, filter);
    }

    @Override
    public void onCreate() {
        Log.i("SilentModeService", "onCreate");
        super.onCreate();
    }

在我的 list 文件中,我添加了这些行

    <service android:name=".services.SilentModeService"       
         android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
            <action android:name="com.example.MyEvent.services.ACTION_REQUEST_INTERRUPTION_FILTER" />
        </intent-filter>
    </service>

我的 OnCreate() 方法没有被调用。但我可以通过切换通知的安全选项来触发它和绑定(bind)。

我运行应用程序的方式是使用 Genymotion 模拟 API 21 android。

我试过很多次,但似乎从未调用过 onStartCommand() 方法。

代码很大程度上受到了 Noyze github 项目的启发: https://github.com/Tombarr/Noyze/blob/master/src/main/AndroidManifest.xml

最佳答案

一个容易被忽视的错误...

requestInterruptionFilter() 中使用:

context.startService(request);

代替

context.sendBroadcast(request);

关于android - 扩展 NotificationListener 的服务永远不会启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164066/

相关文章:

android - ADT 是否支持 Java 7 API

android - Android 中的推特

java - 是否可以选择禁用 Java/Android 中的垃圾创建者/收集器?

android - 使用 startForeground() 调用的多个前台服务的单个通知

添加共享用户 ID 后,Android 应用无法从市场更新

android - 带有@null 背景的图像按钮(透明)

android - 如何在窗口管理器参数中添加 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES?

android - 如何在从手机卸载应用程序时删除 SD 卡上的文件夹

Android,如何排除特定 flavor 的特定权限?

android - 打开应用程序后没有任何显示