在调试模式下运行时,通知侦听器服务未启动

时间:2018-01-21 18:11:50

标签: android android-service android-notifications

我正在使用NotificationListenerService构建应用程序。但总是当我在调试模式下运行应用程序时,服务未启动。我将代码缩减为以下内容:

我的Acticity:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")
        startActivity(intent)
    }

    override fun onResume() {
        super.onResume()
        val isServiceRunning = isMyServiceRunning(NLService::class.java)
        Log.i("MainActivity", "service running: " + isServiceRunning)

    }

    private fun isMyServiceRunning(serviceClass: Class<*>): Boolean {
        val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        for (service in manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.name == service.service.className) {
                return true
            }
        }
        return false
    }
}

服务:

class NLService : NotificationListenerService() {

    private val TAG: String? = "NLService"

    override fun onBind(intent: Intent): IBinder? {
        Log.i(TAG, "onBind()")
        return super.onBind(intent)
    }

    override fun onCreate() {
        super.onCreate()
        Log.i(TAG, "onCreate()")
    }

    override fun onDestroy() {
        super.onDestroy()
    }

    override fun onNotificationPosted(sbn: StatusBarNotification?) {
        Log.i(TAG, "onNotificationPosted() sbn: $sbn")
        super.onNotificationPosted(sbn)
    }
}

当然我在清单中添加了这个:

<service
    android:name=".NLService"
    android:label="MyNLService"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>

</service>

在调试模式下启动应用程序时,我总是在service running: false中获取日志输出onResume。正常启动时,该值为true,无需调试。出了什么问题以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

好的,最后我没有一个完整的解决方案,而是一种接近工作解决方案的改进。

那么我原来的应用代码中的技术问题实际上是什么?我是如何解决它们的?

  1. 我在NLService类'onConnect()方法中做了一些初始化。我将所有这些初始化移至onListenerConnected(),添加了handler.postDelayed(runnable, 500);
  2. 我在MyHandlerClass类中创建了一个类的对象(我们称之为NLService),并将对该服务的引用传递给它。这不是一个好的解决方案,因为NotificationListenerService中的Android documentation says something about many methods
      

    服务应该在执行此操作之前等待onListenerConnected()事件。

  3. 所以在MyHandlerClass我打电话给nlService.getActiveNotifications()。在Android调用NLService s'onListenerConnected之前,此调用已经可能。所以我为NLService内的方法制作了包装器,例如:

    fun getActiveNotifications(): Array<StatusBarNotification>?
    {
        return if (isConnected)
        {
            super.getActiveNotifications()
        }
        else
        {
            null
        }
    }
    

    我在isConnectedonListenerConnected()

    中切换了我的布尔变量onListenerDisconnected()

    现在,在调试模式下运行app时,服务仍会崩溃。但是在正常模式下运行时,可以通过所描述的改进来减少崩溃的数量。