Android课程(基础)

第一章、基础知识

1、DVMJVM区别

Dalvik :基于寄存器,编译和运行快

Jvm:基于栈,编译运行慢

字节码区别

Dalvik:执行.dex格式的字节码,是对.class文件进行压缩后产生的,文件变小

Jvm:执行.class格式的字节码

 

运行环境:

Dalvik:一个应用启动都运行一个单独的虚拟机,运行在一个单独的进程

Mv:只能运行一个实例,所有应用都在同一个jvm


资料下载地址http://pan.baidu.com/s/1ntLpkm9

2、解决模拟器创建或启动的问题

解决办法:

  1. 删除.android文件夹

  2. 配置环境变量:ANDROID_SDK_HOME=D:\android…../,,

解决模拟器运行慢的问题

模拟器如果是用的intelcpu,可以安装加速器来提高运行速度:

IntelHaxm.exe

但有些电脑安装报错,需要进入BIOS设置开启CPU虚拟化后即可安装


3、工程配置文件详解

--src(源码文件夹)

                   界面类

                   重写的方法:

                   onCreate:在当前类(activity)对象创建时自动调用;

这是个回调方法,不是我们调用的,是系统在一定条件下自动调用的,基本都是以on开头onXXX这些方法我们只需重写。

                   调用父类处理一些默认的初始化工作

                                     super.onCreate(savedInstanceState);

                   设置窗口要显示的内容视图(界面/布局):

                                      setContentView(R.layout.activity_main);

--gen(自动生成的源码文件夹)

                   Rjava:对应res文件夹

                   Drawble:图片资源

       Layout:布局

                  String:字符串常量

 --res

                   Drawable-xxx:图片文件夹(为了适配不同分辨率的手机)

                   Layout:界面的布局文件(功能类似于html)

                   Values:常量文件夹

                            String.xml:包含固定的字符串,在布局中引用:@string/name


4、Androidmanifest.xml主配置文件清单

<?xml version="1.0" encoding="utf-8"?>
 <!--
 Package属性:指定当前应用的唯一包名
 versionName属性:指定应用的版本号
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.example.yabushan.aidsservice" >
     <!--对手机版本进行要求
         minSdkVersion:最小的版本,如果手机的版本小于此值,不能安装此应用
         targetSdkVersion:最佳的版本,手机的版本可以大于此值
     -->
     <uses-sdk
         android:minSdkVersion="8"
         android:targetSdkVersion="23"
         />
     <!--
         icon:应用的图标
         label:应用的名称
         theme:应用的主题
     -->
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme" >
         <!--
         activity标签:配置我们的Activity类
         name属性:全类名,可以省略包名部分,以点号开头
         label属性:界面的标题
         theme属性:指定activity以什么形式弹出
         -->
         <activity android:name=".MainActivity"
             android:label="@string/app_name">
             <!--
                 意图过滤器:intent-filter
                 目的:让当前Activity成为主界面Activity
                 LAUNCHER:发射器,category中设置它,应用图标才会显示在桌面上,才可以点击启用
             -->
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
         
         <activity android:name=".SecondActivity"
             android:label="@string/app_name"
             android:theme="@android:style/Animation.InputMethod">
         </activity>
         
         <!--服务,待补充-->
         <service
             android:name=".AppService"
             android:enabled="true"
             android:exported="true" >
         </service>
     </application>
 
 </manifest>


5、调试工具

Android调试桥,是多种用途的调试工具,帮助管理设备或模拟器的状态

常用命令

         Adb

         adb shell

         adb install –r apkPath  安装apk文件

        

 

DDMS :

ANDROID 开发环境中的dalvik虚拟机调试监控服务

Eclipse中提供的android应用开发的调试工具

DDMS的四个重要的视窗

         Logcat:查看日志输出

         File explorer :查看系统内部文件

Devices:显示关联的android设备

Emulator Control:操作控制关联的android设备

 

Log:

         日志打印信息,四个级别:V W I E

6、手机尺寸相关的概念

手机的尺寸:屏幕对角线的长度,单位为英寸(63.5px)

手机的像素密度:每英寸屏幕能显示的像素数,像素密度越大,显示画面细节越丰富。

        计算:像素密度=1+(长度像素数-1)的平方+(宽度像素数-1)的平方)/屏幕尺寸;

        DPI:每英寸所打印的点数或线数的缩写,用来表示打印机打印分辨率,但有时会用dpi来代替ppi

         手机的密度:Denisty

尺寸单位:

1px:就是一个像素点的大小

Dp/dip:density-independent pixels(密度无关像素)

1dp=(dpi/160)px

1dp=density px

1px=1/density dp

Sp:scaled pixels(可缩放像素)dp类似,但是可以根据用户的字体大小首选项进行缩放

Android在运行时会自动将dp/dip/sp为单位的尺寸转换为像素单位的值

Dppx的比较:

         px为单位的长度,在差手机上会变大,在好手机上变小

         dp为单位则不会变化

Dpsp的比较:

用户可以在系统设置中设置文本的大小;

如果字体大小使用sp为单位,设置有效果

如果字体大小使用dp为单位,设置没效果

注:

在布局文件视图的宽高尽量使用match_parent/wrap_content

如果必须指定特定值,使用dp/dip做单位

文本大小使用sp做单位


第二章、组件


1、组件特点

a、组件的类必须实现特定接口或继承特定类;

b、需要在配置文件中配置其全类名

c、组件的对象不是通过new来创建,而是系统自动创建

d、组件的对象具有一定的生命周期,他的类中有对应的生命周期回调方法

2、反射应用场景

a、配置文件中配置全类名;

b、 布局文件定义标签;

c、显式意图:Intent(Context context,Class c)


3、Activity

用来提供一个能让用户操作并与之交互的界面


4、意图(intent)

Intent的理解:

         意图:信使(Ac)


Intent 意图分类:

显示意图:

         明确指定的目标组件的意图;

                   创建对象:Intent(Context context,Class clazz)

                   何时使用:当操作当前自己应用的组件时使用

隐示意图:

         没有明确指定目标组件的意图

                   创建对象:intentstring action

                   何时使用:当操作其他应用的组件时使用

5、Intent和activity结合使用

Intent

Intent(Context packageContext,Class<?> cls):用于创建显示意图对象

Intent(String action):用于创建隐示意图对象;

putExtra(String name,XXX value):保存额外数据

XXX getXXXExtra(String name):获取额外数据

setData(Uri data):设置有特定格式的uri数据;

Activity

startActivity(Intent intent):一般启动Activity

startActivityForResult(int reqCode,intent intent):带回调启动Activity

onActivityResult(int reqCode,int resultCode,intent data):回调方法

setResult(int resultCode,intent data):设置要返回的结果

finish():结束当前Activity

getIntent():得到启动Activity的意图    


代码如下:

第一个页面以及布局文件

public class MainActivity extends Activity implements OnClickListener {
	
	private Button button1;
	private Button button2;
	
	private EditText editText;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		//调用父类的初始化方式
		super.onCreate(savedInstanceState);
		//设置布局
		setContentView(R.layout.activity_main);
		//获取要操作的对象
		button1=(Button) findViewById(R.id.button1);
		button2=(Button) findViewById(R.id.button2);
		editText=(EditText) findViewById(R.id.EditText);
		//设置监听
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
	}
	/**
	 * 实现OnClickListener接口需要覆盖的方法
	 * param:v 发生事件的视图对象
	 * 由于下面两种返回方法中的1、2、3步骤相同,所以提取出来
	 */
	@Override
	public void onClick(View v) {
		
		//1、显示创建intent
		Intent intent=new Intent(this, IntentActivity.class);
		//2、获取edittext输入框中的数据
		String message=editText.getText().toString();
		//3、将数据保存到intent中
		intent.putExtra("message", message);
		if(v==button1){//不带结果返回
			//4、启动Activity
			startActivity(intent);
		}else{
			//带结果返回启动intent
			//4、带回调启动activity
			int reqestCode=2;
			startActivityForResult(intent, reqestCode);
		}
	}
	
	/**
	 * 当执行要返回值启动时,要覆盖此方法获取返回值内容
	 * requestCode :请求时携带过去的code
	 * resultCode:返回结果时指定的code
	 * data:返回的intent对象
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		//1、判断此处的requestCode是否是发送请求时携带过去的code
		if(requestCode==2 && resultCode==3){
			//2、从data中获取数据
			String messageString=data.getStringExtra("RESULT");
			//3、显示
			editText.setText(messageString);
		}
	}
	
}
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText 
        android:id="@+id/EditText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="请输入数据。。。"
        />
    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="不带返回结果" 
        android:onClick="NoResult"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="BackResult"
        android:text="带返回结果" />

  

</LinearLayout>


第二个acitivity以及布局文件

public class IntentActivity extends Activity {
	
	private EditText edittext;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_intent);
		
		//获取要操作的对象
		edittext=(EditText) findViewById(R.id.BackMessage);
		//1.得到intent对象
		Intent intent=getIntent();
		//2.通过intent读取额外的数据
		String message=intent.getStringExtra("message");
		//3.显示到EditText
		edittext.setText(message);
	}
	/**
	 * 点击一般返回按钮时,执行该方法
	 */
	public void back1(View v){
		//关闭当前页面
		finish();
	}
	public void back2(View v){
		//1、保存一个结果
		int resultCode=3;
		//2、创建一个带额外数据的intent,由于此处是返回结果,目标activity已经明确,故不需要传参
		Intent data=new Intent();
		//3、获取输入框中的内容
		String message=edittext.getText().toString();
		data.putExtra("RESULT", message);
		//4、设置结果
		setResult(resultCode, data);
		//5、关闭当前activity
		finish();
		
	}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText 
        android:id="@+id/BackMessage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/back1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="一般返回"
        android:onClick="back1" />

    <Button
        android:id="@+id/back2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="带结果返回"
        android:onClick="back2" />

</LinearLayout>

第三章、activity生命周期

1、生命周期

103724_JSN7_2482052.jpg

2、四种状态

——运行:

    可见可操作

——暂停:

    可见但不可操作

——停止:

    不可见但存在

—死亡:

    对象不存在

103745_ydmb_2482052.jpg

3、activity各个过程转换执行的方法

3-1、界面从“死亡”-->"运行"的过程:

    创建对象——OnCreate()——》onStart()——onresume()——可见可操作(运行状态)

3-2、界面从“运行”——“死亡”的过程:

    onpause()——onstop()——ondestroy()——activity对象成为垃圾对象——不可见也不存在

3-3、界面从“运行”——“停止”的过程:

    onpause()——onstop()——不可见但存在

3-4、界面从“停止”——“运行”的过程:

    onrestart()——onstart()——onresume()

3-5、界面从“运行”——“暂停”的过程:

    onpause()

3-6、界面从“暂停”——运行的过程:

    onresume()


4、activity的栈

4-1、在android中,系统用Task Stack(Back Stack)结构来存储管理启动的activity对象

4-2、一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的activity对象

5、activity的launchmodel形式

默认standar模式

    在android中,启动一个activity有时需要总是创建一个新对象,有时需要复用已有的对象,可以通过在配置activity是通过launchMode属性指定launchMode属性值(4个):

    standard:

        标准模式,每次调用startActivity()方法就会产生一个新的实例

    singleTop:

        如果已经有一个实例位于activity栈的顶部时,就不产生新的实例;如果不位于栈顶,就会产生一个新的实例;

    singleTask:

        只有一个实例,默认在当前Task中

    singleInstance:

        只有一个实例,创建时会新建一个栈,且此栈中不能有其他对象

6、activity设置监听的几种方式

方式一:Activity中添加监听:

View.setOnClickListener(OnlickListener listener);//点击监听

View.setOnLongClickListener(OnLongClickListener listener);//长按监听

方式二:布局添加监听:

Layout中:android:οnclick=”方法名

Activity中:public void 方法名(View v){}


给视图添加监听的三种方式

方式一:视图对象. setOnClickListener(OnClickListener listener);

方式二:实现onclickListener接口

监听方式三:创建一个监听对象

7、activity启动流程

并非activity之间直接启动,需要通过系统的activityManager来启动

110502_4Xeh_2482052.jpg



转载于:https://my.oschina.net/yabushan/blog/636497

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值