我有一个 android 应用程序正在尝试使用 api 18 中的新 NotificationListenerService 类。我创建了自己的服务类,该类继承自此类并覆盖了 onNotificationPosted 和 onNotificationRemoved 事件,尽管我的服务似乎可以正常启动这些当我收到或删除通知时,似乎从未调用 2 个事件。
有没有人在这个类上取得过任何成功,或者他们愿意分享的任何源代码来展示如何使用这个类?
最佳答案
根据我的经验,几乎所有这些答案都非常接近正确的解决方案!
CORE问题似乎是在开发过程中出现的;在您开发代码时,当您在调试 session 之间更新您的应用时,“通知访问”设置将不再有效。
如果您的 APK/二进制文件发生更改并且 NotificationListenerService 停止:
- 重启即可解决。
- 返回“通知访问”并禁用和重新启用您的应用,它可以解决问题。
希望在通过 Google Play 更新您的应用时这不是问题。
作为最佳实践,我为我的应用添加了一个溢出菜单选项,该选项仅显示在非发布版本中,让我可以轻松访问设置:
NotificationListener.java:
public class NotificationListener
extends NotificationListenerService
implements RemoteController.OnClientUpdateListener
{
private static final int VERSION_SDK_INT = VERSION.SDK_INT;
public static boolean supportsNotificationListenerSettings()
{
return VERSION_SDK_INT >= 19;
}
@SuppressLint("InlinedApi")
@TargetApi(19)
public static Intent getIntentNotificationListenerSettings()
{
final String ACTION_NOTIFICATION_LISTENER_SETTINGS;
if (VERSION_SDK_INT >= 22)
{
ACTION_NOTIFICATION_LISTENER_SETTINGS = Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS;
}
else
{
ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
}
return new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS);
}
...
}
menu_my_activity.xml:
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MyActivity"
>
<item
android:id="@+id/action_application_info"
android:title="@string/action_application_info"
app:showAsAction="never"
/>
<item
android:id="@+id/action_notification_settings"
android:title="Notification Settings"
app:showAsAction="never"
/>
</menu>
MyActivity.java:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_my_activity, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
MenuItem menuItem;
menuItem = menu.findItem(R.id.action_application_info);
if (menuItem != null)
{
menuItem.setVisible(BuildConfig.DEBUG);
}
menuItem = menu.findItem(R.id.action_notification_settings);
if (menuItem != null)
{
menuItem.setVisible(BuildConfig.DEBUG && NotificationListener.supportsNotificationListenerSettings());
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.action_application_info:
startActivity(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName())));
return true;
case R.id.action_notification_settings:
startActivity(NotificationListener.getIntentNotificationListenerSettings());
return true;
default:
return super.onOptionsItemSelected(item);
}
}
关于android - 无法让 NotificationListenerService 类工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17911883/