从onReceive方法启动android应用程序(如果它不是活动的)

从onReceive方法启动android应用程序(如果它不是活动的),android,android-activity,android-service,android-broadcastreceiver,Android,Android Activity,Android Service,Android Broadcastreceiver,我在后台服务中有一个计时器。它广播一个意图,该意图在活动onReceive() 如果应用程序被用户杀死,我想启动它。否则我想继续使用该应用程序。我正在使用以下代码从onReceive()重新启动应用程序 在if块中应使用哪个条件?检查应用程序是否正在运行,可以执行以下操作:- if(isProcessRunning("package_name")) { Intent i = new Intent(context, MainActivity.class); i.addFlags(I

我在后台服务中有一个计时器。它广播一个意图,该意图在活动
onReceive()
如果应用程序被用户杀死,我想启动它。否则我想继续使用该应用程序。我正在使用以下代码从
onReceive()
重新启动应用程序


if
块中应使用哪个条件?

检查应用程序是否正在运行,可以执行以下操作:-

if(isProcessRunning("package_name")) {
    Intent i = new Intent(context, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
}


public boolean isProcessRunning(String process) {
    ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
    List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
    for(int i = 0; i < procInfos.size(); i++){
        if (procInfos.get(i).processName.equals(process)) {
            return true;
        }  
    }
    return false;
}
从您的活动中,请执行以下操作:-

public void onCreate(Bundle savedInstanceState){
  MyApplication.setRunning(true);
}

public void onDestroy(){
  MyApplication.setRunning(false);
}
您可以这样检查:-

if(!MyApplication.isRunning()) {
    Intent i = new Intent(context, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
}

您只需要在接收时检查应用程序是否正在运行

代码片段

boolean isApplicationRunning = false;
ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
for(int i = 0; i < procInfos.size(); i++){
if(procInfos.get(i).processName.equals("com.me.checkprocess")){
    Log.e("Result", "App is running - Doesn't need to reload");
    isApplicationRunning = true;
    break;
 } 
 else
 {
    Log.e("Result", "App is not running - Needs to reload);
  }
}

}

我不知道这是不是正确的方法,但下面的代码对我很有用

private boolean isApplicationAlive(Context context) {
    boolean applicationAlive = false;
    ActivityManager m = (ActivityManager) context.getSystemService( context.ACTIVITY_SERVICE );
    List<ActivityManager.RunningTaskInfo> runningTaskInfoList =  m.getRunningTasks(10);
    Iterator<ActivityManager.RunningTaskInfo> itr = runningTaskInfoList.iterator();
    while(itr.hasNext()){
        ActivityManager.RunningTaskInfo runningTaskInfo = (ActivityManager.RunningTaskInfo)itr.next();
        String activityName = runningTaskInfo.topActivity.getShortClassName();                
        if(activityName.equalsIgnoreCase(".activities.MainActivity")) {
            applicationAlive = true;
        }

    }          
    return applicationAlive;
}
private boolean是可应用的(上下文){
布尔应用性=假;
ActivityManager m=(ActivityManager)context.getSystemService(context.ACTIVITY_服务);
List runningTaskInfoList=m.getRunningTasks(10);
迭代器itr=runningTaskInfoList.Iterator();
while(itr.hasNext()){
ActivityManager.RunningTaskInfo RunningTaskInfo=(ActivityManager.RunningTaskInfo)itr.next();
String activityName=runningTaskInfo.topActivity.getShortClassName();
if(activityName.equalsIgnoreCase(“.activities.MainActivity”)){
应用性=真;
}
}          
返回应用性;
}

您是希望每次都启动新的MainActivity,还是希望在应用程序被终止时启动MainActivity。如果您的应用程序已经在运行,那么您希望显示哪个活动?服务将发送广播,此时如果应用程序处于活动状态,我正在执行一些逻辑,否则我想启动新的MainActivity并执行相同的逻辑如果我的应用程序正在运行,那么我想保持在我所在的屏幕上,check onTerminate未在我的案例中执行您能告诉我您的应用程序有一个活动还是多个活动吗?如果有多个活动,您的应用程序中是否有任何BaseActivity被所有其他活动扩展。它只有两个活动,登录和维护上述解决方案可以工作,但我有一个具有相同进程名称的后台服务,因此,即使应用程序被终止,isProcessRunning()也会返回true如果您只有两个活动,那么您可以通过在我的应用程序中保留静态变量来管理应用程序的运行状态,并在活动被破坏时将其设为false。上述解决方案可行,但我有一个具有相同进程名称的后台服务,因此,即使应用程序被终止,isApplicationRunning也是真的。在这种情况下,您可以在共享首选项isApplicationRunning中保留一个标志,并且每当第一个activity oncreate()执行时,将该标志设置为真,当调用ondestroy()时,将其设置为假。现在,您可以在onreceive中检查sharepreference isApplicationRunning标志是否为false,然后执行操作
boolean isApplicationRunning = false;
ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
for(int i = 0; i < procInfos.size(); i++){
if(procInfos.get(i).processName.equals("com.me.checkprocess")){
    Log.e("Result", "App is running - Doesn't need to reload");
    isApplicationRunning = true;
    break;
 } 
 else
 {
    Log.e("Result", "App is not running - Needs to reload);
  }
}
if(isApplicationRunning) {
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
private boolean isApplicationAlive(Context context) {
    boolean applicationAlive = false;
    ActivityManager m = (ActivityManager) context.getSystemService( context.ACTIVITY_SERVICE );
    List<ActivityManager.RunningTaskInfo> runningTaskInfoList =  m.getRunningTasks(10);
    Iterator<ActivityManager.RunningTaskInfo> itr = runningTaskInfoList.iterator();
    while(itr.hasNext()){
        ActivityManager.RunningTaskInfo runningTaskInfo = (ActivityManager.RunningTaskInfo)itr.next();
        String activityName = runningTaskInfo.topActivity.getShortClassName();                
        if(activityName.equalsIgnoreCase(".activities.MainActivity")) {
            applicationAlive = true;
        }

    }          
    return applicationAlive;
}