如何使应用程序在关闭或崩溃时打开,保持应用程序始终存活



我使用Android 7.1 SDK 25用于工业。我想创建一个应用程序,可以启动设备和自动启动时,应用程序崩溃,或任何问题,使我的应用程序关闭。

  • 当设备打开时,我完成了启动应用程序

  • 我的问题:如何自动使我的应用程序始终活着。我不确定我的应用是否能够每天、每周都运行而不出现任何漏洞、崩溃……我不能等到重启设备再打开我的应用程序。我找到方法使我的应用程序重新启动:'

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
int mPendingIntentId = 102;
PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);

'但它只工作,如果我的应用程序工作的生命周期,我把它放在onDestroy或其他地方,我捕捉到的错误。但如果我的应用程序突然崩溃与我的控制是不工作的。我找到了这个答案;保持前台应用24/7全天候运行;似乎是我的路

如果你想用编程的方式做到这一点,你可以使用每个"x"轮询的服务。毫秒来查看你的应用是否在前台。如果不是,它将在前台启动/显示你的应用。

但这不是工作,在这个主题中没有答案。

更新:

*正如上面的链接回答,我创建了一个服务,该服务从第一次启动应用程序开始工作,如果我的应用程序被杀死,它仍然工作。但是我可以再次调用start app

1:我使用"android.arch.lifecycle:extensions:1.1.0"检查应用程序是否在forceground上工作。

public class ArchLifecycleApp extends Application implements LifecycleObserver {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppBackgrounded() {
//App in background
Log.d("TAG", "App in background" );
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onAppForegrounded() {
// App in foreground
Log.d("TAG", "App in foreground" );
}

}

第二:我创建了我的服务,每隔3秒检查一次应用程序

public class PersistService extends Service {
private static final int INTERVAL = 3000; // poll every 3 secs
private WeakReference<MainActivity> weakReference = null;
public void init(MainActivity mainActivity){
this.weakReference = new WeakReference<>(mainActivity);
if (weakReference != null){
MainActivity activity = weakReference.get();
if (activity != null){
}
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
TimerTask task = new TimerTask() {
@Override
public void run() {
Log.d("TAG", "start command");
if (!ProcessLifecycleOwner.get().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)){
weakReference.get().turnOnApp();//if app not in forceground then turn on it
}
}
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(task, 0, INTERVAL);
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}

}

My turnOnApp in MainActivity

public void turnOnApp(){
PackageManager pm = getPackageManager();
Intent launchIntent = pm.getLaunchIntentForPackage("MY_PACKET_NAME");
startActivity(launchIntent);
}

服务工作,但不能调用myapp返回。它给出了Error

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.Reference.get()' on a null object reference

它发生了,因为我的应用程序被杀死,主活动没有运行。我很困惑,有其他的方法来调用应用程序打开

你是否想制作一个用户永远不会离开你的应用程序的kiosk类型的应用程序?如果是这样,你想做一个主屏幕应用,那么把你的应用设置为默认的主屏幕。要使它成为主屏幕,使用:

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

在你的AndroidManifest中作为你想成为home Activity的Activity的intent filter。

如果不是,你只是想要一个持续运行的应用程序-不能在现代Android上完成。为了延长电池寿命,它被故意设置成不可能。如果你能更具体地告诉我们你在做什么,我们也许能帮你做一些其他的事情,让你得到你需要的数据。

相关内容

最新更新