请教:一个程序可以启动两次

时间:2022-01-26 18:50:22
大家好:当我安装程序完成时,不退出安装界面,直接点击"完成"启动应用程序,然后按HOME键回到桌面,然后再点击启动图标,这个时候程序会重新启动,这样我的程序就有两个实例在运行。
如果完成安装后,回到桌面,然后按启动图标,启动程序后,再回到桌面,按启动图标,这个时候就直接把我的程序切到前台,而不会再次启动一个进程实例。
我已经在我的AndroidManifest.xml文件中,为启动的第一个界面Activity,设置了属性:android:launchMode="singleTop"
请问,该问题如何解决?

16 个解决方案

#1


 
  没遇见过点击“完成”程序还会启动的。

  不过,你可以尝试这个方法:

  每个程序的启动都会有一个Activity被创建,那么,从Activity的启动到消失,中间总共有七个流程:
 
  

   public class Activity extends ApplicationContext {
     protected void onCreate(Bundle savedInstanceState);

     protected void onStart();
     
     protected void onRestart();

     protected void onResume();

     protected void onPause();

     protected void onStop();

     protected void onDestroy();
 }



    So,当每次你点击了Home或者返回按钮时,Activity都会执行onStop方法。

    这时, 你可以在onStop方法内加上一句代码让你的程序直接关闭,那么,每次你再启动你的程序的时候

    就不会是两个了:

    你可以加上:

     this.finish();  —— 关闭当前的Activity

     或者:

     System.exit(0); —— 关闭当前应用程序(实际上此方法在Android中起不到真正的关闭程序,但同样可以关闭当前的程序界面,具体原因没有研究过)

#2




  如果你是一个新手的话,上面的代码你可能看起来会有些吃力,我给你举个例子吧:

  

   /**
 * 继承Activity类
 *
 * 并重写父类(Activity)的方法: onCreate() and onStop() 
 *
 * 还有其他的五个方法,如果你需要的话,可以自己测试下它们的用途
 *
 */
public class MyActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 程序在第一次启动的时候会执行这里
}

@Override
protected void onStop() {
super.onStop();
// 每次当你的Activity被隐藏或者被关闭时,程序都会执行这里,So,你可以在这里加上你要关闭程序的代码
this.finish();
// Or
// System.exit(0);
}
}  

#3


按HOME键的需求是切到后台,肯定是不能退出的,呵呵。

#4



  那也不可能是一个程序两个实例在运行啊

  你在onCreate方法中打印一句话,看看这个方法被调用了几次。

  如果是一次的话,那就证明该程序只运行了一个实例。

#5


程序运行两次我也遇到过,坐等高人解决

#6




   暂时没有发现解决方案,而且启动两个实例的现象只会在安装成功后在安装界面上面的打开按钮启动程序,然后home键,再从桌面启动程序才会出现这个问题。

   安装完成后,从桌面启动程序,再按home键,再从桌面启动程序,不会启动两个程序。

#7


我也坐等高人。。。

#8


高人什么时候出现呢?

#9


launch mode 应该是single task.
SINGLE TASK
If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored

SINGLE TOP
If the activity being started is the current activity (at the  top of the back stack), then the existing instance receives a call to onNewIntent(), instead of creating a new instance of the activity.

#10


我也碰到这个问题了,
尝试把第一个Activity设置为singTask,这时倒是实现了不启动两次,但带来更大BUG:
正常操作时,在有Activity堆栈的情况下,再次从桌面启动,显示的是第一个ACTIVITY,他上面的act被销毁了,明显是不能满足需求。
目前发现可能的原因:
从安装后启动(长按home相同)时,信息如下:
11-25 14:10:59.103: INFO/ActivityManager(1189): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.***}
而从桌面启动时:
11-25 14:14:40.837: INFO/ActivityManager(1189): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.*** bnds=[362,398][478,545] }
多了catgery和binds。
莫非是因为这点差异导致系统识别task发生误判?

还希望大家多讨论啊

#11


楼主,这个问题有结果了没???

#12


该回复于2012-02-03 09:09:41被版主删除

#13


引用 11 楼 yeyutianya 的回复:
楼主,这个问题有结果了没???

没有。

#14


引用 13 楼 buleriver 的回复:
引用 11 楼 yeyutianya 的回复:
楼主,这个问题有结果了没???

没有。

今天我也碰到这个问题,网上找了半天,解决了。
实际上第二次启动只是UI启动了,内部数据没变,在启动时做个判断,如果不是唯一,就关掉当前的。
private static int OnlyOne = -1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        Log.e("OnlyOne0", ""+OnlyOne);
        if(OnlyOne != -1){
         finish();
         return;
        }
        setContentView(R.layout.main1);
        OnlyOne = 1;

#15


引用 14 楼 chinavfeng 的回复:
引用 13 楼 buleriver 的回复:
引用 11 楼 yeyutianya 的回复:
楼主,这个问题有结果了没???
没有。
今天我也碰到这个问题,网上找了半天,解决了。
实际上第二次启动只是UI启动了,内部数据没变,在启动时做个判断,如果不是唯一,就关掉当前的。
private static int OnlyOne = -1;
    @Override
 ……

这样做也有问题。

#16


的确有这个问题的,而且是能重现的。有方法了分享一下啊!

#1


 
  没遇见过点击“完成”程序还会启动的。

  不过,你可以尝试这个方法:

  每个程序的启动都会有一个Activity被创建,那么,从Activity的启动到消失,中间总共有七个流程:
 
  

   public class Activity extends ApplicationContext {
     protected void onCreate(Bundle savedInstanceState);

     protected void onStart();
     
     protected void onRestart();

     protected void onResume();

     protected void onPause();

     protected void onStop();

     protected void onDestroy();
 }



    So,当每次你点击了Home或者返回按钮时,Activity都会执行onStop方法。

    这时, 你可以在onStop方法内加上一句代码让你的程序直接关闭,那么,每次你再启动你的程序的时候

    就不会是两个了:

    你可以加上:

     this.finish();  —— 关闭当前的Activity

     或者:

     System.exit(0); —— 关闭当前应用程序(实际上此方法在Android中起不到真正的关闭程序,但同样可以关闭当前的程序界面,具体原因没有研究过)

#2




  如果你是一个新手的话,上面的代码你可能看起来会有些吃力,我给你举个例子吧:

  

   /**
 * 继承Activity类
 *
 * 并重写父类(Activity)的方法: onCreate() and onStop() 
 *
 * 还有其他的五个方法,如果你需要的话,可以自己测试下它们的用途
 *
 */
public class MyActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 程序在第一次启动的时候会执行这里
}

@Override
protected void onStop() {
super.onStop();
// 每次当你的Activity被隐藏或者被关闭时,程序都会执行这里,So,你可以在这里加上你要关闭程序的代码
this.finish();
// Or
// System.exit(0);
}
}  

#3


按HOME键的需求是切到后台,肯定是不能退出的,呵呵。

#4



  那也不可能是一个程序两个实例在运行啊

  你在onCreate方法中打印一句话,看看这个方法被调用了几次。

  如果是一次的话,那就证明该程序只运行了一个实例。

#5


程序运行两次我也遇到过,坐等高人解决

#6




   暂时没有发现解决方案,而且启动两个实例的现象只会在安装成功后在安装界面上面的打开按钮启动程序,然后home键,再从桌面启动程序才会出现这个问题。

   安装完成后,从桌面启动程序,再按home键,再从桌面启动程序,不会启动两个程序。

#7


我也坐等高人。。。

#8


高人什么时候出现呢?

#9


launch mode 应该是single task.
SINGLE TASK
If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored

SINGLE TOP
If the activity being started is the current activity (at the  top of the back stack), then the existing instance receives a call to onNewIntent(), instead of creating a new instance of the activity.

#10


我也碰到这个问题了,
尝试把第一个Activity设置为singTask,这时倒是实现了不启动两次,但带来更大BUG:
正常操作时,在有Activity堆栈的情况下,再次从桌面启动,显示的是第一个ACTIVITY,他上面的act被销毁了,明显是不能满足需求。
目前发现可能的原因:
从安装后启动(长按home相同)时,信息如下:
11-25 14:10:59.103: INFO/ActivityManager(1189): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.***}
而从桌面启动时:
11-25 14:14:40.837: INFO/ActivityManager(1189): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.*** bnds=[362,398][478,545] }
多了catgery和binds。
莫非是因为这点差异导致系统识别task发生误判?

还希望大家多讨论啊

#11


楼主,这个问题有结果了没???

#12


该回复于2012-02-03 09:09:41被版主删除

#13


引用 11 楼 yeyutianya 的回复:
楼主,这个问题有结果了没???

没有。

#14


引用 13 楼 buleriver 的回复:
引用 11 楼 yeyutianya 的回复:
楼主,这个问题有结果了没???

没有。

今天我也碰到这个问题,网上找了半天,解决了。
实际上第二次启动只是UI启动了,内部数据没变,在启动时做个判断,如果不是唯一,就关掉当前的。
private static int OnlyOne = -1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        Log.e("OnlyOne0", ""+OnlyOne);
        if(OnlyOne != -1){
         finish();
         return;
        }
        setContentView(R.layout.main1);
        OnlyOne = 1;

#15


引用 14 楼 chinavfeng 的回复:
引用 13 楼 buleriver 的回复:
引用 11 楼 yeyutianya 的回复:
楼主,这个问题有结果了没???
没有。
今天我也碰到这个问题,网上找了半天,解决了。
实际上第二次启动只是UI启动了,内部数据没变,在启动时做个判断,如果不是唯一,就关掉当前的。
private static int OnlyOne = -1;
    @Override
 ……

这样做也有问题。

#16


的确有这个问题的,而且是能重现的。有方法了分享一下啊!