0

バックグラウンドで継続的に実行されるサービスを開始する 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" >
4

1 に答える 1

0

他の誰かがこの問題を抱えている場合は、大きなキューを構築している可能性のある実行中のプロセスを確認してください。私の場合、タイマーを scheduleAtFixedRate に設定しました。これは、電話がスリープ状態のとき (タイマーが実行できなかったため)、大量のタイマー イベントがタイマー スレッド キューに追加されていたことを意味し、電話が起動したときにアプリがしばらくフリーズする原因となりました。タイマー タスクのすべてのバックログを完了します。

于 2013-10-28T19:52:35.623 に答える