扩展 NotificationListener 的服务永远不会启动
Service extending NotificationListener never starts
我在实施通知侦听器时遇到问题。基本思路是想改变phone的静默模式,但是目前连相关的函数(onStartCommand)都没有被调用。使 phone 静音的方法是调用 enableSilentMode() 方法,该方法在内部发送意图广播,由 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();
}
在我的清单文件中,我添加了行
<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() 方法没有被调用。但我可以通过切换通知的安全选项来触发它和绑定。
我的 运行 应用程序的方式是使用 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);
我在实施通知侦听器时遇到问题。基本思路是想改变phone的静默模式,但是目前连相关的函数(onStartCommand)都没有被调用。使 phone 静音的方法是调用 enableSilentMode() 方法,该方法在内部发送意图广播,由 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();
}
在我的清单文件中,我添加了行
<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() 方法没有被调用。但我可以通过切换通知的安全选项来触发它和绑定。
我的 运行 应用程序的方式是使用 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);