Android 学习零星问题记录

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 的绘制过程、事件分发等都是采用类似的思想。至于数据恢复过程也是类似的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值