【问题标题】:Start android application if it is not alive from onReceive method从 onReceive 方法启动 android 应用程序(如果它不存在)
【发布时间】:2016-01-11 05:51:56
【问题描述】:

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

if(/*Application is killed*/) {
    Intent i = new Intent(context, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
}

if 块中应该使用哪个条件?

【问题讨论】:

  • 您想每次都启动新的 MainActivity 还是想在应用程序被杀死时启动 MainActivity。如果您的应用程序已经在运行,那么您想显示哪个活动?
  • 服务会发送一个广播,此时如果应用程序还活着,我正在执行一些逻辑,否则我想启动新的 MainActivity 并执行相同的逻辑
  • 如果我的应用程序正在运行,那么我想留在我所在的同一屏幕上,
  • 检查this post

标签: android android-activity android-service android-broadcastreceiver


【解决方案1】:

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

代码片段

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);

}

【讨论】:

  • 上述解决方案有效,但我有一个进程名称相同的后台服务,所以即使应用程序被杀死,isApplicationRunning 也是如此
  • 在这种情况下,您可以在共享首选项 isApplication Running 中保留一个标志,并且每当您的第一个活动 oncreate() 执行时将该标志设置为 true,并且当调用 ondestroy() 时将其设置为 false。现在您可以检查 onreceive 中的 sharepreference isApplicationRunning 标志是否为假,而不是执行您的操作
【解决方案2】:

我不知道这是否正确,但以下代码对我有用。

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;
}

【讨论】:

    【解决方案3】:

    要检查您的应用程序是否正在运行,您可以做的是:-

    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;
    }
    

    试试这个,它会起作用的。

    如果您的应用程序只有一个或两个活动,或者如果您的应用程序有一个由其他活动扩展的 BaseActivity,请执行以下操作:-

     public class MyApplication extends Application{
      private static boolean mIsRunning = false;
    
      public static boolean isRunning(){
        return mIsRunning;
      }
     public void setRunning(boolean isRunning){
       mIsRunning = isRunning;
     }
     }
    

    从你的活动做:-

    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);
    }
    

    【讨论】:

    • onTerminate 在我的情况下没有执行
    • 你能告诉我你的应用程序有一个活动还是多个活动。如果有很多活动,你的应用程序中是否有任何 BaseActivity 由所有其他活动扩展。
    • 只有2个activity,login和main
    • 上述解决方案有效,但我有一个进程名称相同的后台服务,所以即使应用程序被杀死,isProcessRunning() 也会返回 true
    • 如果您只有两个活动,那么您可以通过在我的应用程序中保留静态变量来管理应用程序运行状态,并在活动被破坏时将其设为假。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多