アンドロイドで仕事をする方法がたくさんあるので、私はこの回答を投稿し、問題を解決するための私のアプローチを述べます。明らかに問題によって私は一般的な問題を意味しませんSMS_RECEIVED
受信機自体。
Iフォアグラウンドサービスを開始し、そこでは、私は(例えば)着信コールを聞くために、動的または明示的な受信機を登録しますMainActivity.java
で
:
CallMonitorService.java
S
onCreate()
方法ここで
String action = "START"
final Intent intent = new Intent(this, CallMonitorService.class);
intent.setAction(action);
startService(intent);
で
final IntentFilter intentFilter = new IntentFilter();
intentFilter.setPriority(2147483647);
intentFilter.addAction("android.intent.action.PHONE_STATE");
this.callExplicitReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
// do the stuff here
}
}
};
registerReceiver(callExplicitReceiver, intentFilter);
、その後:私はフィールドとしてBroadcastReceiver callExplicitReceiver
を持っています:
if (intent.getAction().equals("START")) {
Intent callServiceNotificationIntent = new Intent(this, MainActivity.class);
callServiceNotificationIntent.setFlags(
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent
.getActivity(this, CALL_SERVICE_REQUEST_CODE,
callServiceNotificationIntent, CALL_SERVICE_FLAG);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(CALL_NOTIFICATION_CONTENT_TITLE)
.setTicker(CALL_NOTIFICATION_TICKER)
.setContentText(CALL_NOTIFICATION_CONTENT_TEXT)
.setSmallIcon(R.drawable.ic_info_outline_black_24dp)
.setContentIntent(pendingIntent)
.setOngoing(true)
.build();
startForeground(CALL_NOTIFICATION_ID, notification);
}
し、最終的に:
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(callExplicitReceiver);
}
ユーザーが原因undismissable通知の実行中のサービスの通知を受け、それはアンドロイドOreo
が何を望んだ、しかしを通じてされているので、私は良いアプローチと考えますアプリケーションユーザーのボタンは、サービスを破棄した結果としてサービスと監視受信機を停止することができました(コードのその部分をクリアしました)。
私は周期的なチェック方法を備えたジョブスケジューラが正しい解決策かもしれないと思います。 – VVB
@VVB SMSを受信したときに音を鳴らすTTSアプリを開発していますが、受け取ったSMSを検出する時間を短くするとパフォーマンスに悪影響があり、適切な解決策ではないようです。 – szamani20
'SMS_RECEIVED'アクションは、新しい暗黙のブロードキャスト制限から免除されています。 https://developer.android.com/guide/components/broadcast-exceptions.html –