web-dev-qa-db-ja.com

Androidでバックグラウンドでアクティビティを実行する方法

私のアプリケーションでは、一定の間隔でテキストメッセージをユーザーに送信する必要があります。そのために、メッセージ送信コードをバックグラウンドで実行する必要があります。アラームマネージャーを使用して、特定の時間にアクティビティを開始しています。これを行う別の方法はありますか?

18
picaso

基本的にUIのない​​アクティビティである Services の使用を検討することができます。

22
kaspermoerch

サービスを使用せずに(アクティビティが必要な場合もあります)アクティビティでそれを実行したい場合は、アクティビティを通常の方法で開始し、アクティビティのonCreateでそれをmoveTaskToBack(true)を呼び出して背景。

プログラムで実行中のアプリケーションをバックグラウンドに送信する を参照してください

このメソッドを使用する場合は、アクティビティを開始するインテントに追加情報を追加して、onCreateでバックグラウンドに送信する必要があることを認識できるようにする必要があります。これを行うには、IntentのputExtraメソッドを呼び出します。アクティビティのonCreateでは、getIntentを使用して呼び出し側のIntentを取得し、たとえばgetStringExtraを使用してそこに配置した情報を取得します(文字列の追加情報を使用しました)。 Intentクラスのドキュメントを参照してください。

2018年8月の更新:ただし、一部のデバイスでは、バックグラウンドに送信される前に、アクティビティが画面上で点滅する(つまり、短時間表示される)場合があります。システムが通知を処理して、タスクをバックグラウンドで送信するのが遅すぎるようです。 onCreateでメソッドを呼び出す場合は、Activityウィンドウを描画する前に、そのことを知るための十分な時間が必要です。 IMOこれはシステムの欠陥です。このように発生するべきではありませんが、発生します。
それで、とにかく、これが問題であり、可能であればサービスでそれを行う方がよいでしょう。

2
VSim

はい。これを実現するには、Serviceを使用する必要があります。明示的にクローズされるまで、バックグラウンドで実行できます。 IntentServiceは別の代替手段です

http://developer.Android.com/guide/topics/fundamentals/services.html

0
drooooooid

これは役立つかもしれません。これをAndroid manifest ..:

uses-permission Android:name = "Android.permission.ACCESS_BACKGROUND_SERVICE"

また、長い/バックグラウンドプロセスにAsyncClassを使用します。

http://developer.Android.com/reference/Android/os/AsyncTask.html

0
Awais Tariq

その目標を達成するためにService sを使用することをお勧めしますが、別のアプリから何かが必要なときに同様の状況に遭遇しました-サービスのインテントがエクスポートされなかったため、唯一の方法サービスを開始することは、アクティビティを開始することです。そして、ユーザーをアプリ内に留めておくために、アクティビティをフォアグラウンドに保つ必要があります。その場合、AsyncTaskで他のアクティビティを開始し、onPostExecuteで自分自身を再起動することができます。

    (new AsyncTask<Void, Void, Void>() {
        boolean starting = false;
        @Override
        protected Void doInBackground(Void... params) {
            if(!externalServiceRunning()){
                Intent externalIntent = getPackageManager().getLaunchIntentForPackage("com.external...");
                if (externalIntent != null) {
                    starting = true;
                    startActivity(externalIntent);
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            if(starting) {
                Intent myApp = getPackageManager().getLaunchIntentForPackage("com.my.myapp");
                if (myApp != null) {
                    startActivity(myApp);
                }
            }
        }
    }).execute();
0
Ohad Cohen