サービスで PhoneStateListener を実行しようとしてもこの問題が発生しましたが、N 個のデバイスでのみ「ドロップ」するようです。
さまざまな提案を試みましたが、7.0 を実行している nexus5x でリスナーを失い続けました。私がそれを 100% の時間維持することができた方法は、サービスにフォアグラウンド通知を実行させることでした。基本的に、サービスが有効である限り通知トレイに表示されます。これにより、発信通話に応答したときなど、以前にリスナーをドロップするさまざまな電話状態でサービスが存続します。通知ビルダーに音や振動を設定しない限り、ほとんど目立ちません。私のサービス onCreate は次のようになります。
MyPhoneListener phoneStateListener = new MyPhoneListener(getApplicationContext());
TelephonyManager telephonymanager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
telephonymanager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
Intent notificationIntent = new Intent(this, YourActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_favorites) //status bar icon
.setContentTitle("Title") //whatever title
.setContentText("Stuff") //main notification text
.setContentIntent(pendingIntent).build();
startForeground(12345, notification);
次に、サービスの onDestroy で通知を削除します。
@Override
public void onDestroy() {
Log.i("log", "service ending");
NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotifyMgr.cancel(12345);
}
お役に立てれば!