0

locationlistener を使用してブレッドクラムを作成することにより、電話の場所を追跡するアプリがあります。ユーザーはアプリを起動して、パンくずリストの記録を開始できます。トレイルは、旅行の記録としてライブアプリの Google マップに表示されます。ブレッドクラムは、他のアプリケーションが実行中の旅行にアクセスできる強力なデータベースにも送信されます。

ユーザーはアプリを終了できますが、ブレッドクラムの記録を継続することを選択して、他のアプリがリアルタイムでトレイルを追跡できるようにします。ユーザーが録画を停止しに戻ってこなかった場合、録画は開始から 24 時間後に停止します。ただし、ユーザーはいつでもアプリを起動して、トレイルの記録を停止できます。

私のアプリは、アクティビティと、アクティビティがバインドされるサービスで構成されているようです。他のアプリはこのサービスを使用しないため、このサービスは IPC サービスである必要はないようです。このサービスは、クラウド データベースへの場所のリッスンとログ記録のすべてを行います。

私の問題は、CommonsWare ブックの 1226 ページに、私のアプリが unbindService() を呼び出すと、Android がサービスをシャットダウンすると書かれていることです。アクティビティがそれをシャットダウンするか、24 時間後に自動的にシャットダウンするまで、それを続けたいと思います。

これは、私のサービスが IPC サービスでなければならないということですか?

アクティビティを終了してサービスを実行したままにするにはどうすればよいですか? ありがとう、ゲイリー

4

2 に答える 2

1

まず、サービスをフォアグラウンド サービスにします。

これに沿った何か。(サービスの onCreate 関数でこのコードを呼び出します。)

    Notification notification = new Notification(
            R.drawable.ic_dialog_info,
            getText(R.string.notification_text),
            System.currentTimeMillis());
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    Intent activityIntent = new Intent(this, YourMainClass.class);
    activityIntent.setAction(Intent.ACTION_MAIN);
    activityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    activityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            activityIntent, 0);
    notification.setLatestEventInfo(this,
            getText(R.string.notification_title),
            getText(R.string.notification_text), pendingIntent);
    startForeground(123, notification);

もう 1 つのことは、サービスをアクティビティにバインドしないことです。アクティビティが殺されても、サービスも死なせたくありません。また、デバイスのメモリが不足している場合、アクティビティがフォアグラウンドにない場合は、強制終了される可能性があります。もちろん、メモリが解放されると、Android はメモリを再作成しようとします。ただし、ユーザー エクスペリエンスは低下します。サービスがアクティビティにバインドされておらず、フォアグラウンドである場合、ガベージ コレクション中に OS によって最後に強制終了される必要があります。

次の簡単なコードを使用して、アクティビティにバインドせずにサービスを開始できます。このコードは、アクティビティ onCreate で呼び出すことができます。

Intent service = new Intent(YourContext, YourService.class);
startService(service);

うまくいけば、これはあなたを助けます!乾杯

于 2012-10-03T23:30:34.847 に答える
0

私のアプリは、アクティビティと、アクティビティがバインドされるサービスで構成されているようです。

必ずしも。これにはコマンド パターンを使用できます。

これは、私のサービスが IPC サービスでなければならないということですか?

必ずしも。これにはコマンド パターンを使用できます。

アクティビティを終了してサービスを実行したままにするにはどうすればよいですか?

を使用してサービスを開始しstartService()ます。それが 24 時間存続するかどうかは、あなたの管理下にはありません (それをフォアグラウンド サービスにするための Dyarish の回答を参照してください。これにより、24 時間存続する可能性が高くなります)。

于 2012-10-05T15:32:12.523 に答える