1、安卓逍遥不被eclipse或者Android studio 识别
解决方法:
从自己的安卓SDK安装目录下的platform-tools拷贝adb.exe及adb开头的两个dll,拷贝到逍遥目录里覆盖同名文件。然后,先打开Eclipse或Android Studio,再打开逍遥安卓模拟器(目前只支持4.2以下安卓版本)。
注:上面提到的三个文件是:adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll
为防止博主文件删除等,特在此自己做记录,感谢原博主分享
解决来源:
https://blog.csdn.net/lixiang_y/article/details/54945547
2、Android程序写好,打算编译运行,出现如下错误提示:
android library projects cannot be launched
百度找到解决方案,是因为我在设置Android project的properties选项时,为该项目多勾选了一个选项:isLibrary
按现在理解,改选项的意思是,该项目是否是一个library?勾选,则表示会把该项目作为library对待,而不是一个单独的android app
根据百度经验提示,去除该选择项上的对号就可以了
https://jingyan.baidu.com/article/636f38bb3df187d6b9461048.html
3、Android 中,activity的生命周期问题之一: 源于《Android开发艺术与探索》
onStart() 、onStop() 组合与 onResume()、onPause()组合有什么区别?
答:在分析源码之后发现一个问题,当新启动一个Activity的时候,旧Activity的onPause() 方法会限制性,然后才启动新的Activity
到底是否是这样呢?用一个小例子验证下:
创建两个activity,第一个activity中添加一个按钮,点击按钮启动第二个activity,第一个activity中重写onPause()、onStop()方法,第二个activity中重写onResume()、onStop() 方法,在其中添加日志。(在此我通过第一个布局文件中,设置全屏view代替button,随意点击一处即可触发)详细代码如下:
public class MainActivity extends Activity {
private static final String TAG="MainActivity";
TextView tView=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tView=(TextView) this.findViewById(R.id.tv01);
tView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.d(TAG, "onPause++++");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.d(TAG, "onStop++++");
}
}
public class SecondActivity extends Activity{
private static final String TAG="SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
Log.d(TAG, "onCreate++++");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onPause();
Log.d(TAG, "onStart++++");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onStop();
Log.d(TAG, "onResume++++");
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.secondandroidproject.MainActivity" >
<TextView
android:id="@+id/tv01"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="this is first Activity" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="this is second activity"
android:textSize="20sp">
</TextView>
</LinearLayout>
运行可见:
12-18 16:56:12.047: D/MainActivity(2418): onPause++++
12-18 16:56:12.054: D/SecondActivity(2418): onCreate++++
12-18 16:56:12.055: D/SecondActivity(2418): onStart++++
12-18 16:56:12.055: D/SecondActivity(2418): onResume++++
12-18 16:56:12.485: D/MainActivity(2418): onStop++++
通过如上分析,旧的activity的onPause() 方法先调用,然后新Activity才启动,这也证实了该结论是正确的。Android官方文档对onPause() 的解释有这么一句:不能再onPause() 方法中做重量级的操作,因为必须onPause() 执行完成以后新Activity才能Resume,从这一点也能间接证明我们的结论。通过分析这个问题,我们知道onPause 和onStop 都不能执行耗时的操作,尤其是onPause,这也意味着,我们应当在onStop中做操作,从而使得新Activity尽快显示出来并切换到前台。
4、异常情况下的生命周期分析 ——来源《安卓开发艺术与探索》
1)情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
先解释下Android系统的资源加载机制。以图片为例,当我们把一张图片放在drawable目录后,就可以通过Resources去获取这张图片,比如drawable-mdpi、drawable-hdpi、drawable-land等。当应用程序启动时,系统会根据当前设备的情况去加载合适的Resources资源。比如说横屏和竖屏时手机可以拿到不同的图片(需要设定landscape或者portrait状态下图片不同)。如果activity当前处于竖屏状态,假设突然旋转屏幕,由于系统配置发生了改变,在默认情况下,activity就会被销毁并且重新创建,当然我们也可以组织系统重新创建我们的activity。
默认情况下,如果我们的activity不做特殊处理,那么当系统配置发生改变后,activity就会被销毁并重新创建,其生命周期如下所示
当系统配置发生改变后,activity会被销毁,其onPause()、onStop()、onDestroy()均会被调用,同时由于activity是在异常情况下终止的,系统会调用onSaveInstanceState() 来保存当前activity的状态。这个方法的调用时机是在onStop()之前,它和onPause()没有既定的时序关系,它既可能在onPause之前调用,也可能在onPause之后调用。需要强调一点的是,这个方法只会出现在activity被异常终止的情况下,正常情况下系统不会回调这个方法。当activity被重新创建后,系统会调用onRestoreInstanceState,并且把activity销毁时,onSavedInstanceState方法所保存的 Bundle对象作为参数同时传递给onRestoreInstanceState() 和onCreate() 方法。因此,我们可以通过onRestoreInstanceState和onCreate()方法来判断Activity是否被重建了。如果被重建了,那么我们就可以取出之前保存的数据并恢复,从时序上来说。onRestoreInstanceState的调用时间在onStart() 之后。
同时我们要知道,在onSaveInstanceState和onRestoreInstanceState 方法中,系统自动为我们做了一定的恢复工作。当activity在异常情况下需要重新创建时,系统会默认为我们保存当前activity的视图结构,并且在activity重启后为我们恢复这些数据,比如文本框中用户输入的数据、listview滚动的位置等。这些view相关的状态系统都能够默认为我们恢复,具体针对某一个特定的VIew系统能为我们恢复哪些数据,可以查看view的源码。和Activity一样,每个view都有onSaveInstanceState和onRestoreInstanceState这两个方法,看一下它们的具体实现,就能知道系统能够自动为每个view恢复哪些数据
关于保存和恢复view层次结构,传统的工作流程是这样的:首先activity被意外终止时,activity会调用onSavedInstanceState去保存数据,然后activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据。顶层容器是一个viewGroup,一般来说它很可能是DecorVIew。最后顶层容器再去一一通知它的子元素来保存数据。这样整个数据保存过程就完成了。可以发现,这是一种典型的委托思想,上层委托下层、父容器委托子元素去处理一件事情,这种思想在Android中有很多应用,比如view 的绘制过程、事件分发等都是采用类似的思想。至于数据恢复过程也是类似的。