3

UIスレッドからAsyncTaskを介してスレッドを生成した場合、UIスレッドが終了すると、このスレッドは強制終了されますか?

私のAsyncTask(spawned fom UI)は操作を実行してから、必要に応じて通知マネージャーを呼び出します(私のアプリケーション機能の一部)。これはうまく機能しますが、アプリケーションが終了すると通知が停止します。これはUIスレッドが終了したためだと思います。したがって、子も終了します。

私はサービスを検討しましたが(最初はデーモンと同様に実行されると想定しています)、これらはUI /メインスレッドで実行されるため、UIスレッドの終了後も永続的ではないことを読みました。

私の質問は、Androidアプリから生成されたデーモンの機能をどのように取得できるかということです。スポーンする親プロセスの外部で権限は必要ありません。また、再起動後も永続的である必要はありません。

POSIX APIはNDKを介してスレッドを作成しますか、それとも完全に間違っていますか?

Androidで数日しか過ごしなかったので、それでも自分の道を感じようとしています。どうもありがとう!

4

3 に答える 3

1

UIスレッドからAsyncTaskを介してスレッドを生成した場合、UIスレッドが終了すると、このスレッドは強制終了されますか?

自動的にではなく、すぐにではありません。スレッドは完了するまで、またはAndroidがプロセスを終了するまで、どちらか早い方で実行されます。

私はサービスを検討しましたが(最初はデーモンと同様に実行されると想定しています)、これらはUI /メインスレッドで実行されるため、UIスレッドの終了後も永続的ではないことを読みました。

サービスは、古典的なLinuxの意味では実際には「デーモン」ではありません。UIの観点からは、サービスは自動的にバックグラウンドで実行されます。スレッドの観点からは、自動的にバックグラウンドになるわけではありません。サービスが行う作業に時間がかかる場合は、バックグラウンドスレッドで実行する必要があります。違いは、サービスが実行されている場合、Androidはプロセスをそれほど早く終了する傾向がないことです。

私の質問は、Androidアプリから生成されたデーモンの機能をどのように取得できるかということです。

これは、取得しようとしている「デーモン」の機能によって異なりますが、質問で説明することを怠っています。

NDKを介したPOSIXAPIのようなスレッド

それはあなたに何の役にも立たないでしょう。プロセスが終了しても、スレッドは引き続き終了します。

于 2012-06-08T15:30:33.983 に答える
1

スレッドはプロセス内で実行されます。Androidは、アプリケーションが破棄されると、アプリケーションのプロセスを一時停止(後で再利用するため)または強制終了します。これにより、すべてのスレッドが使用されます。したがって、デーモンはスレッドではなく、切断されたプロセスである必要があります。Androidは、これらを開始できないように意図的に設定されています(ただし、サブプロセスはRuntime.exec()とその親戚で簡単です)。NDKでfork/exec()を実行することで、やりたいことができると思いますが、結果のアプリを実行するには電話をルート化する必要があり、多くの問題が発生します。特に、root化された電話の保証は無効になることがよくあります。

于 2012-06-08T15:35:18.337 に答える
0

ほぼ同じ機能を実装する必要がありました。バックグラウンドから通知を送信します。

それはかなり単純です。サービスを開始し、サービス内から新しいスレッドを生成します。

Androidプラットフォームが、スレッドを自分で開始する必要がない、すぐに使える機能を提供するシナリオはたくさんあります。

例えば:

  • スレッドが何かを待つ必要がある場合は、AlarmManagerを使用して定期的な「ウェイクアップ」イベントをスケジュールできます。これにより、バックグラウンドでの実行が処理されます。
  • または、バックグラウンドでデータをバックエンドと同期する必要がある場合は、バックグラウンドでの実行も処理するSyncAdapterAPIを使用できます。

CommonsWareが提案したように:

これは、取得しようとしている「デーモン」の機能によって異なりますが、質問で説明するのを怠っています。

于 2012-06-08T15:41:43.227 に答える