我正在研究如何让我的Android应用程序保持在前台。
这将是一个私人分发的应用程序,所以我可以尽可能地确保它在设备上不断运行(HDMI电视棒)
那么,我该如何确保无论如何都能让应用程序持续运行?该应用程序在资源使用方面相当轻量级,因此希望全天候运行不应该成为问题。
我了解到清单文件中的persistent参数,但似乎只适用于系统应用程序?
我应该把我的应用程序变成系统应用程序吗? 如何操作并且是否有帮助?
我正在研究如何让我的Android应用程序保持在前台。
这将是一个私人分发的应用程序,所以我可以尽可能地确保它在设备上不断运行(HDMI电视棒)
那么,我该如何确保无论如何都能让应用程序持续运行?该应用程序在资源使用方面相当轻量级,因此希望全天候运行不应该成为问题。
我了解到清单文件中的persistent参数,但似乎只适用于系统应用程序?
我应该把我的应用程序变成系统应用程序吗? 如何操作并且是否有帮助?
如果您想使用外部应用程序,请使用:Autostart and 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"/>
import android.os.PowerManager;
public class MyActivity extends Activity {
protected PowerManager.WakeLock mWakeLock;
/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle icicle) {
setContentView(R.layout.main);
/* This code together with the one in onDestroy()
* will make the screen be always on until this Activity gets destroyed. */
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
this.mWakeLock.acquire();
}
@Override
public void onDestroy() {
this.mWakeLock.release();
super.onDestroy();
}
}
<uses-permission android:name="android.permission.WAKE_LOCK" />
//Your activity
@Override
public void onPause() {
super.onPause();
if (yourservice != null) {
yourservice.validateActivityOnPause();
}
}
//Your service
public void validateLynxActivityOnPause() {
//Do some stuff here
Intent startActivityIntent = new Intent(this, LynxActivity.class);
startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(startActivityIntent);
}
现在 activityManager.getRunningAppProcesses() 已经被弃用(从 API21 开始),您需要替换为:
RunningTaskInfo foregroundTaskInfo = activityManager.getRunningTasks(1).get(0);
String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
使用:
List<ActivityManager.RunningAppProcessInfo> tasks = activityManager.getRunningAppProcesses();
String foregroundTaskPackageNameTest = tasks.get(0).processName;
不要忘记使用以下代码导入List:
import java.util.List;
你可以通过在<intent-filter>
标签中添加以下2个类别标签,使你的应用程序成为一个启动器:
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.HOME"/>
那么你应该始终检查是否有其他应用程序在顶部运行,运行以下代码将用户引导到我们的应用程序:
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
我尝试过这个解决方案,但它无法隐藏那些在顶部绘制的应用程序,比如Facebook Messenger的聊天头。