activity启动方式可能带来的一些bug

在做项目的时候,突然碰到几个界面的来回跳转之后,关闭activity,要么出现重复,要么界面关闭不了(按back键只是退出一个特定的activity)。出现这样的情况就要考虑activity的启动方式了。

1、activity的启动方式总结

(1)standard

android总会为目标activity创建一个新的实例,并把activity添加到当前Task中,即不会启动新的TASK,新的activity会添加到原有的Task中。(hashcode不同,TSAKid相同)

(2)singletop

复用Task栈顶Activity实例,其余与standard方式相同。

(3)singleTask

在同一个Task中只有一个acyivity实例。(若该实例存在且不再栈顶,则会移除它前面所有的activity实例)

(4)singleInstance(用的多)

系统保证无论从那个Task启动目标activity,只会创建一个目标activity实例,并使用一个全新的TASK来加载该实例。

1)若不存在该目标activity则创建一个全新的TASK。在把该目标实例加入TASK栈顶。

2)若存在该目标activity,系统会不顾一切把他所在的TASK转到前台显示出来。


2、使用startActivity方法启动的activity界面要考虑activity的TASK管理方式。在清单文件中配置activity的启动模式,避免出现bug,关闭不了,或是重复界面的出现。


3、实现在一个activity中关闭另外一个activity

(1)在第一个activity中用一个静态非私有字段来保存该类的实例。然后在另外一个activity 中获得该字段并调用finish方法,完成该操作。

(2)具体代码如下:

public class OneActivity extends Activity {
	 static OneActivity instance;//关键
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);
        instance=OneActivity.this;//关键
        Log.i("OneActivity", "onCreate");
    }
    
    public void start(View v){
    	startActivity(new Intent(OneActivity.this,TwoActivity.class));
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.one, menu);
        return true;
    }
    @Override
    protected void onDestroy() {
    	Log.i("OneActivity", "第一个activity关闭");
    	super.onDestroy();
    }
    
}


public class TwoActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
        Log.i("TwoActivity", "onCreate");
    }

    public void back(View v){
    	startActivity(new Intent(TwoActivity.this,OneActivity.class));
    	
    }
    public void  myStop(View v){
    	
    	OneActivity.instance.finish();
    }
  
    @Override
    protected void onDestroy() {
    	// TODO Auto-generated method stub
    	super.onDestroy();
    	 Log.i("TwoActivity", " onDestroy()");
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.one, menu);
        return true;
    }
    
}

startActivity来回跳转的结果并按back键销毁如下所示:




先跳转到第2个activity,在第2个activity里销毁第一个activity实例,在back退出应用结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值