Android面试题总结 (持续更新)

1.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 
这个时候A会回调该函数,

Java代码

public void onSaveInstanceState(Bundle outState) {   

      super.onSaveInstanceState(outState);    

      // 执行临时数据的存储动作。

      outState.putLong("id", 1234567890);

}  

 你可以在Activity A中覆写该函数并且将存储动作写在该函数中。

B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,
不同于直接启动的是这回onCreate()里是带上参数savedInstanceState(这里稍微讲解一下InstanceState: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

  在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时可以恢复其先前状态。

,没被收回的就还是onResume就好了。

savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会 用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。

Java代码

if(savedInstanceState != null){  
     long id = savedInstanceState.getLong("id");  
}  


2. 如何退出Activity?

对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()System.exit()这样的方法。现提供几个方法,供参考:
1、抛异常强制退出:该方法通过抛异常,使程序Force Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
2、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
/**
 * 一个类 用来结束所有后台activity
 * @author Administrator
 *
 */
public class SysApplication extends Application {
	//运用list来保存们每一个activity是关键
    private List<Activity> mList = new LinkedList<Activity>();
    //为了实现每次使用该类时不创建新的对象而创建的静态对象
    private static SysApplication instance; 
    //构造方法
    private SysApplication(){}
    //实例化一次
    public synchronized static SysApplication getInstance(){ 
        if (null == instance) { 
            instance = new SysApplication(); 
        } 
        return instance; 
    } 
    // add Activity  
    public void addActivity(Activity activity) { 
        mList.add(activity); 
    } 
    //关闭每一个list内的activity
    public void exit() { 
        try { 
            for (Activity activity:mList) { 
                if (activity != null) 
                    activity.finish(); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            System.exit(0); 
        } 
    } 
    //杀进程
    public void onLowMemory() { 
        super.onLowMemory();     
        System.gc(); 
    }  
}
 
在每个activity被创建时加上
SysApplication.getInstance().addActivity(this);

将该activity添加到list中去。


 当你想关闭时,调用SysApplication的 exit方法。

//关闭整个程序  
SysApplication.getInstance().exit(); 


3 、发送特定广播:在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。
4 、递归退出在打开新的 Activity 时使用 startActivityForResult ,然后自己加标志,在 onActivityResult 中处理,递归关闭。除了第一个,都是想办法把每一个 Activity 都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个 Activity 都设置了 nosensor ,在两个 Activity 结束的间隙, sensor 可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。 为了编程方便,最好定义一个Activity基类,处理这些共通问题
5. 利用系统的activity栈, 例如从A->B->C->D,这时我需要从D直接退出程序。这个时候可以利用Intent的Flag “Intent.FLAG_ACTIVITY_CLEAR_TOP”来启动activity A, 然后再finish掉A。

DEMO: http://download.csdn.net/detail/mysoul3009/7089327

在D中使用下面的代码
Intent intent = new Intent();   
intent.setClass(D.this, A.class);  
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置  
startActivity(intent);  
finish();//关掉自己

在A中加入代码:
//Override  
protected void onNewIntent(Intent intent) {  
// TODO Auto-generated method stub  
super.onNewIntent(intent);  
//退出  
        if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {  
               finish();  
        }  
}
将A写成程序的入口, A的Manifest.xml配置成android:launchMode="singleTop" , 添加activity标签 android:theme=”@android:style/Theme.NoDisplay” 


3.请解释下在单线程模型中MessageHandlerMessage QueueLooper之间的关系。

4.Activity的4种启动方式之间的区别








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值