バックグラウンドで継続的に実行されるサービスを開始する Android アプリがあります。このサービスが開始されると、通知がクリックされたときにアプリのメイン UI をロードする保留中のインテントが作成されます。これは、電話がアクティブで使用されている間は機能しますが、デバイスが 30 分以上非アクティブであると、ユーザーが通知をクリックした後に奇妙なバグが表示されます。UI をロードしてすべてのボタンなどを表示する代わりに、黒い画面が表示されてアプリがフリーズします。
サービスを正しく開始していない場合に備えて、サービスを開始した方法を次に示します。
public class MainActivity extends Activity {
[...]
public void serviceOn(View view){
startService(new Intent(getBaseContext(), StableIPService.class));
}
[...]
}
そして、これが私のサービスのコードです
public class StableIPService extends Service {
[...]
public int onStartCommand(Intent intent, int flags, int startId) {
Notification notice;
//The intent to launch when the user clicks the expanded notification
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Build notification
notice = new NotificationCompat.Builder(this)
.setContentTitle(getString(R.string.app_name))
.setContentText("Checking for malicious network connections")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendIntent)
.build();
notice.flags |= Notification.FLAG_NO_CLEAR;
startForeground(myID, notice);
return (START_STICKY);
}
[...]
}
...そして、これらのプロパティを AndroidManifest.xml ファイルに追加すると役立つとどこかで読んだので、それらを追加しました...まったく役に立たないように見えましたが、ここにあります。
<activity
android:name=".MainActivity"
[...]
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true" >