1.LeetCode10
递归的基本要义:要有严格递归出口,通常情况下是if(特殊情况)return;if(各种情况)return ,else return
注:阶乘的递归写法,要加溢出判断!
int jiecheng(int n)
{
int result;
if(n==0)
return 1;
if(n>0)
{
result=n*jiecheng(n-1);;
if(result>0&&result<=INT_MAX)
{
return result;
}
else{
return 0;
}
}
}
2.《Android开发艺术探索》第1章
- onStart()和onResume()对比
onStart和onResume都表示Activity已经可见,但onStart时候Activity在后台,onResume时候Activity在前台 - onPause()必须先执行完,新Activity的onResume才会执行(为什么不是onStop执行完再执行?)
答:onStop表示Activity退居后台,但有些新Activity执行不需要旧Activity退出前台 - 如果打开新的Activity使用的是透明主题,则当前Activity不会回调onStop
- 当Activity被系统回收后再次打开,生命周期方法的回调过程从开始一样,但不是所有过程都一样??
- 不能在onPause中做重量级的操作,因为必须onPause执行完成以后新的Activity才能Resume
- Activity被异常结束的两种情况:“资源相关的配置文件发生改变”以及“系统内存不足”
- 只有在Activity被异常结束的情况下,onSaveInstanceState才会执行,且在onStop之前调用,他和onPause没有既定的时序关系
- onRestoreInstanceState在新启动Activity的onStart之后执行(为什么不再onCreat之前执行?)
答:因为重建原Activity,初始化工作相同,且系统通过判断onRestoreInstanceState和onCreate来判断Activity是否应该重建 - 系统异常退出后,如何人工恢复一些数据?(是用onCreat方法还是onRestoreInstanceState?)
答:理论上都可以,但官方推荐onRestoreInstanceState。因为如果onRestoreInstanceState一旦被调用,代表Bundle里值不为null,不用做非空性判断。而onCreat需要判断 - minSdkVersion和targetSdkVersion的区别
答:minSdkVersion在编译期间和运行期间都起作用。在编译期间:低于minSdkVersion的API不能使用,在运行期间:低于minSdkVersion的手机不能安装应用
targetSdkVersion在运行期间作用,表示APP测试运行的Version。决定程序是否以兼容模式运行(版本低的手机将自动使用兼容包来实现一些效果),targetSdkVersion如果太低,程序运行在高版本手机上则可能出错(违背向下兼容原理),所以一般取最新版本 - 每个Activity都有自己的任务栈,Activity A启动B,则B就加入A的任务栈中
- 一个Activity启动时需要指定自己的任务栈和启动方式,如果任务栈不存在,则需要先创建任务栈,再把活动放入栈中
- 给Activity设定启动模式有两种方法:1.在AndroidMenifest中指定(但无法设定FLAG_ACTIVITY_CLEAR_TOP) 2.在Intent中设置标志位(优先级更高但不能设定singleInstance模式)
- 隐式调用Intent(只有一个Intent同时匹配action,category和data才算匹配成功)
- 为Intent设定data,必须调用setDataAndType方法,不能先setData再setType,根据源码,两个方法会彼此消除对方的值
- 对于Service,尽量使用显示调用方式启动服务
- 隐式启动Activity可以先判断是否有符合条件的Intent。方法有两种:1.PackageManager的resolveActivity方法 2.Intent的resolveActivity方法
问题:
- onStop-->onRestart 数据如何恢复??
答:这时候上一个Activity并没有被销毁,onCreate过程依然存在,所以直接onStart重启即可 - singleTop和singleTak的onNewIntent方法是如何回调的??
答:当其他Activity启动singleTop或singleTak的Activity时,不会调用Activity的onCreate方法,而会调用onNewIntent方法,此时要重新setIntent,才能用getIntent获取到
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent); //必须重新设置Intent才能被getIntent方法获取到
processExtraData()
}
系统可能会随时杀掉后台运行的Activity,如果这一切发生,那么系统就会调用onCreate方法,而不调用onNewIntent方法,一个好的解决方法就是在onCreate和onNewIntent方法中调用同一个处理数据的方法,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
processExtraData();
}
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//必须重新设置Intent才能被getIntent方法获取到
processExtraData()
}
private void processExtraData(){
Intent intent = getIntent();
//使用Intent获取的数据进行相应操作
}
- singleInstance中的A如果启动B,B会不会启动??
答:会启动,这时候B会在ActivityMain的任务栈中入栈