18

Android アプリをフォアグラウンドで実行し続ける方法を検討しています。

非公開で配布されるアプリなので、デバイス (HDMI TV スティック) で常に実行されるようにするためにできることは何でもできます。

では、何があってもアプリが実行され続けるようにするにはどうすればよいでしょうか? アプリはリソース使用量の点でかなり軽量であるため、24 時間年中無休で実行しても問題にならないことを願っています.

マニフェストで永続的なパラメーターについて読みましたが、システム アプリにのみ適用されるように見えますか?

アプリをシステム アプリにする必要がありますか? どうすればそれを行うことができますか?

4

7 に答える 7

16
  • 外部アプリを使用する場合: Autostart と StaY!

  • これをプログラムで行いたい場合は、「x」ミリ秒ごとにポーリングするサービスを使用して、アプリがフォアグラウンドにあるかどうかを確認できます。そうでない場合は、アプリをフォアグラウンドで起動/表示します。次のようにします。

    public class PersistService extends Service {
    
        private static final int INTERVAL = 3000; // poll every 3 secs
        private static final string YOUR_APP_PACKAGE_NAME = "YOUR_APP_PACKAGE_NAME";
    
        private static boolean stopTask;
        private PowerManager.WakeLock mWakeLock;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            stopTask = false;
    
            // Optional: Screen Always On Mode!
            // Screen will never switch off this way
            mWakeLock = null;
            if (settings.pmode_scrn_on){
                PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "a_tag");
                mWakeLock.acquire();
            }
    
            // Start your (polling) task
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
    
                    // If you wish to stop the task/polling
                    if (stopTask){
                        this.cancel();
                    }
    
                    // The first in the list of RunningTasks is always the foreground task.
                    RunningTaskInfo foregroundTaskInfo = activityManager.getRunningTasks(1).get(0);
                    String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
    
                    // Check foreground app: If it is not in the foreground... bring it!
                    if (!foregroundTaskPackageName.equals(YOUR_APP_PACKAGE_NAME)){
                        Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(YOUR_APP_PACKAGE_NAME);
                        startActivity(LaunchIntent);
                    }
                }
            };
            Timer timer = new Timer();
            timer.scheduleAtFixedRate(task, 0, INTERVAL);
        }
    
        @Override
        public void onDestroy(){
            stopTask = true;
            if (mWakeLock != null)
                mWakeLock.release();
            super.onDestroy();
        }
    }
    

上記のコードには、画面を常にオンにする「オプション」もあります。もちろん、次の権限が必要です。

<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

また、サービスを登録することも忘れないでください。

    <service android:name="YOURPACAKGE.PersistService" 
     android:enabled="true"/>
于 2014-06-16T19:56:00.347 に答える
2

これは、フォアグラウンド アプリがノンストップで実行されることは技術的に想定されていないため、達成するのは簡単ではありません。また、Android のメモリが不足している場合、リスクが最も低いアプリの強制終了が開始され、ユーザーによるアプリの再起動が必要になります。

前述のように、システムアプリにすることもできますが、デバイスをルート化するか、独自の ROM を構築してアプリを ROM の一部にする必要があると思います。ROMをデバイスにフラッシュできる人はほとんどいないため、おそらくあなたのニーズに最適なソリューションではありません.

最も簡単な解決策は、アプリがホーム画面の代替、つまりランチャー アプリであることをマニフェストに入れることだと思います。頭のてっぺんからの正確なコードはわかりませんが、これは Android マニフェスト内のアプリケーション セクションに入ります。これは、デバイスが起動するか、ユーザーがホーム ボタンを押すとすぐに、アプリに移動することを意味します。

于 2013-08-16T15:14:38.323 に答える