Skip to content

Latest commit

 

History

History
564 lines (401 loc) · 15.4 KB

Android.md

File metadata and controls

564 lines (401 loc) · 15.4 KB

Android 实用网址:http://adt.android-studio.org/index.php

ADT配置

百度云:http://pan.baidu.com/s/1qWFJoF6

在 eclipse 中在线安装地址:http://dl-ssl.google.com/android/eclipse/

通过本地安装,压缩包下载地址:http://developer.android.com/sdk/installing/installing-adt.html

一、Android项目结构分

src:存放java源代码
gen:存放系统自动生成的配置文件(不修改)
Android 4.4.2:该文件夹下包含android.jar文件,这是一个Java归档文件,其中包含构建应用程序所需的所有的Android SDK库(如Views、Controls)和APIs
assets:存放资源文件,不会自动生成id,且不会自动占用空间
bin:存放应用被编译后生成的可执行文件(.apk),以及应用用到被打包到apk中的资源文件
res:存放应用用到的所有资源,如图片、布局等
	drawable:存放不同分辨率的图片资源
	layout:存放布局文件
	values:存放字符串,主题,颜色,样式等资源文件
	AndroidManifest.xml:清单文件,配置一些与应用有关的重要信息,包含包名,权限,程序组件等

二、文本框控件

TextView显示文本框控件

属性:

android:id----控件的id
android:layout_width----控件的宽度
android:layout_height----控件的高度
android:layout_width="wrap_content"	wrap_content:包裹实际文本内容大小
android:layout_width="match_parent"	match_parent:当前控件铺满父类容器(2.3api之后添加的属性值)
android:layout_width="fill_parent"	fill_parent:当前控件铺满父类容器(2.3api之前的属性值)
android:text----文本内容
android:textSize----文本大小
android:textSize="28sp"
android:textColor----文本颜色
android:textColor="#000000"	RGB颜色值
android:backgroud----控件背景

EditText输入文本框控件

属性:TextView基础上添加

android:hint----输入提示文本
android:inputType----输入文本类型
android:inputType="textPassword"	输入格式为密码格
android:inputType="phone"	输入格式为拨号键盘

将 xml 布局文件引入到 activity.java 中

setContentView(R.layout.main_activity);

练习:

1、在 Activity 中需要获取一个 id 是 bookName 的 TextView 控件对象

(TextView)this.findViewById(R.id.bookName)

2、在 Activity 中给一个 TextView 设置字体颜色(tv 为 TextView 对象)

tv.setTextColor(Color.RED)

三、ImageView图片显示控件

属性:

android:src----图像内容		src会自适应
android:src="@drawable/ic_launcher"	调用res/drawable文件夹下相应分辨率的图片
android:background----控件背景		background会填充整个控件
android:background="@drawable/ic_launcher"	不仅可以是图片
android:background="#00ff00"	还可以是RGB颜色

注:为了适配更多的分辨率,将所有图片分别在_hdpi,_mdpi,_ldpi文件夹中各存放一份

四、按钮控件

Button 普通按钮控件

<Button
	android:id="@+id/button1"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:text="Button"/>		一般将字符串存放在res/value文件夹下,后期调用

ImageButton图片按钮控件

<ImageButtom
	abdroid:id="@+id/imageButton1"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:src="@drawableabc_ab_share_pack_holo_light" />	可以不设置,和button一样的显示效果。也可以在图片上带有文字

共同点:

都可以作为一个按钮产生点击事件

产生明显的点击效果

不同点:

Button 有 text 属性,ImageButton 没有

ImageButton 有 src 属性,Button 没有

五、按钮的监听事件

通过匿名内部类实现

private Button loginButton;	  // 1、初始化按钮控件
loginButton = (Button) findViewById(R.id.button1);	  // 2、赋值  findViewById返回的是View对象,需要转换
loginButton.setOnClickListener(new OnClickListener(){	  // 3、设置监听器,通过监听器实现点击事件
	@Override
	public void onClick(View arg0){		// 在当前onClick方法中监听点击按钮的动作
		System.out.println("按钮被点击了");
	}
});

通过外部类监听事件

private Button bt1;
bt1=(Button) findViewById(R.id.button1);

class MyOnClickListener implements OnClickListener{	// 创建自己的外部类
									// OnClickListener 是接口
	@Override
	public void onClick(View v){
	Log.i("tag","父类的onClick事件");
		v.setAlpha(0.5f);	  // 设置透明度,0-1,0表示完全透明,1表示不透明
	}
}
		
bt1.setOnClickListener(new MyOnClickListener(){
	@Override
	public void onClick(View v){
		super.onClick(v);	调用父类的onClick方法
		Toast.makeText(MainActivity.this,"bt1要执行的逻辑",1).show();
	}
});

六、AutoCompleteTextView控件

1、功能:

动态匹配输入的内容,如百度搜索引擎当输入文本时,可以根据内容显示匹配的热门信息

2、属性:

android:completionThreshold="2" ---->设置输入多少字符时自动匹配

3、小案例:

activity_main.xml 文件中:

<AutoCompleteTextView
	android:id="@+id/autoCompleteTextView1"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:completionThreshold="2"		设置输入多少字符时自动匹配
	android:hint="@string/hello_world" >
	<requestFocus />
</AutoCompleteTextView>

MainActivity.java 文件中

public class MainActivity extends Activity{
//初始化AutoCompleteTextView控件
private AutoCompleteTextView autoText=null;
//初始化数据源---匹配文本框输入的内容
private String[] res={"beijing1","beijing2","beijing3","shanghai1","shanghai2"};
	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//初始化AutoCompleteTextView控件
		autoText=findViewById(R.id.autoCompleteTextView1);
		//设置适配器
		ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,res);
		//将适配器与当前AutoComopleteTextView绑定
		autoText.setAdapter(adapter);
	}
}

七、MultiAutoCompleteTextView控件

1、功能:

可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个值选中的时候再次输入值时会自动去匹配,

可用在发短信,发邮件时选择联系人这种类型当中

2、属性:

android:completionThreshold="2" ----设置输入多少字符时自动匹配

3、设置分隔符

	mtxt.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());	此分隔符为,

4、小案例

与 AutoCompleteTextView 案例一样,只需在 MainActivity.java 文件中多为MultiAutoCompleteTextView 设置分隔符

八、ToggleButton控件

1、功能:

ToggleButton 有两种状态:选中和未选中状态

并且需要为不同的状态设置不同的显示文本

2、属性:

android:checked="true"
android:textOn="开"
android:textOff="关"

九、Acticity的创建和使用

Android四大组件

Activity、Service、BroadcastReceiver、Content Provider

1、在src文件夹下创建一个继承Android中Activity类的类

2、重写Activity中onCreate(Bundle savedInstanceState)方法

3、设置显示的布局
	setContentView(R.layout.layout文件夹中布局文件名);

4、在AndroidManifest.xml文件中,注册activity
	有<intent-filter>标签的为程序运行时显示的主页

十、Activity的生命周期

onCreate();创建
onStart();运行
onResume();获取焦点
onPause();失去焦点
onStop();暂停
onDestroy();销毁
onRestart();

1、从创建到销毁的生命周期

onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy()

2、从启动到后台,再到前台的生命周期

onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onRestart()-->onStart()-->onResume()

3、从启动到失去焦点,再到获取焦点的生命周期

onCreate()-->onStart()-->onResume()-->onPause()-->onResume()

十一、ViewPager

ViewPager可以使视左右滑动

android.support.v4.view.ViewPager

1、加载显示的页面

将Layout布局转换为View对象

	(1) LayoutInflater li = getLayoutInflater().from(context);
		li.inflate(resource,root);

	(2) View.inflate(context,resource,root);

2、配置Adapter

	(1) PagerAdapter 数据源:List<View>
	(2) FragmentPagerAdapter 数据源:List<Fragment>
	(3) FragmentStatePagerAdapter 数据源:List<Fragment>

案例:参考 学习案例/AndroidViewPager

十二、OptionsMenu 选项菜单

1、创建选项菜单

重写onCreateOptionsMenu()

-设置菜单项可用代码动态设置 menu.add()

-还可以通过xml设置 MenuInflater.inflate()

2、设置菜单项点击事件

重写onOptionsItemSelected()

案例:

1、新建一个类 MainActivity 继承 Activity

2、重写其中 onCreateOptionsMenu() 方法

@Override
public boolean onCreateOptionsMenu(Menu menu){
	getMenuInflater().inflate(R.menu.main,menu);
	return true;
}

3、res/menu 文件夹下新建 xml 文件

<menu xmlns:android="">
	<item 
		android:id="@+id/action_menu_item1"
		android:orderInCategory="100"
		android:showAsAction="never"
		android:title="菜单一" />
	<item 
		android:id="@+id/action_menu_item2"
		android:orderInCategory="100"
		android:showAsAction="never"
		android:title="菜单二" />
</menu>

4、监听菜单列表点击事件,重写onOptionsItemSelected()

@Override
public boolean onOptionsItemSelected(MenuItem item){
	switch(item.getItemId()){
		case R.id.action_menu_item1:
			Toast.makeText(MainActivity.this,"点击了菜单一",Toast.LENGTH_SHORT).show();
			break;
		case R.id.action_menu_item2:
			Toast.makeText(MainActivity.this,"点击了菜单二",Toast.LENGTH_SHORT).show();
			Intent itent = new Intent(MainActivity.this,SecondActivity.class);
			item.setIntent(intent);
			break;
		default:
			break;
	}
	return super.onOptionsItemSelected(item);
}

十三、Dialog对话框

1、要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法

	setTitle:为对话框设置标题
	setIcon:为对话框设置图标
	setMessage:为对话框设置内容
	setView:给对话框设置自定义样式
	setItems:设置对话框要显示的一个list,一般用于显示几个命令时
	setMultiChoiceItems:用来设置对话框显示一系列的复选框
	setSingleChoiceItems:设置单选按钮
	setNeutralButton:普通按钮
	setPositiveButton:给对话框添加“确认”按钮
	setNegativeButton:给对话框添加“取消”按钮

十四、Broadcast广播

1、普通广播

Intent intent = new Intent();
intent.putExtra("msg","这是一条普通广播");
intent.setAction("com.zhidi.broadcast");
sendBroadcast(intent);

十五、Android 四大组件之 Service

定义:

后台运行,不可见,没有界面

优先级高于Activity

用途:

播放音乐、记录地理信息位置的改变、监听某种动作。。。

注意:

运行在主线程,不能用它做耗时的请求或者动作

可以在服务中开一个线程,在线程中做耗时动作

类型:

1、本地服务(Local Service)

应用程序内部

startService
stopService
stopSelf
stopSelfResult
bindService
unbindService

两种方式:

  1. Start方式:

服务跟启动源没有任何联系

无法得到服务对象

  1. Bind方式:

通过IBinder接口实例,返回ServiceConnection对象给启动源

通过ServiceConnection对象的相关方法可以得到Service对象

学习案例:

2、远程服务(Remote Service)

Android系统内部的应用程序之间

定义IBinder接口

十六、多媒体

1、相机

步骤:

1、在布局文件中添加SurfaceView控件
2、定义变量
	SurfaceView sfv;
	Camera camera;
	SurfaceHolder holder;
	Button bt;
3、实例化变量
	sfv = (SurfaceView)findViewById(R.id.sfv);
	holder = sfv.getHolder();
	bt = (Button)findViewById(R.id.bt);
4、编写异步保存类SavePiture继承Asynctask<parameter,progress,result>
	public String doInBackground(byte[]...pars){
		//保存图片
	}
5、为holder添加回调
	holder.addCallback(new SurfaceHolder.callback()){
		//当预览界面被创建时调用
		surfacecreate(){
			//打开摄像头
			camera = Camera.open();
            //设置预览角度
            camera.setDisplayOritation(90);//角度是90的整数倍
            //设置预览显示器
            camera.setPlayViewDisPlay(holder);
            //开始预览
            camera.startPreView();
		}
		surfacechanged(){
          //获取相机参数
          //设置相机参数
          //开始预览
     	}
     	surfaceDestroy()   
     	{
            //释放相机资源
            camera.release();
            camera = null ;
      	}
	});
6、设置按钮的监听事件,在监听事件中进行拍照
	/**
	    第一个参数:是按下快门时的操作
	    第二个参数:是摄像头获得原始数据时的操作
	    第三个参数:是摄像头将原始数据编译处理后的操作
	*/
	camera.tackPicture(null,null,new PicturCallback(){
        onPictureTacken(byte[] data, Camera c)
        {
            //保存图片
            new SavePicture().excute(data);
            //开始预览
            camera.startPreView(); 
        }
	});
7、添加权限
	<!-- 调用摄像头功能 -->
	<uses-feature android:name="android.hardware.camera" />
	<!-- 调用自动对焦功能 -->
	<uses-feature android:name="android.hardware.camera.autofocus" />
	<!-- 设置允许拍照的权限-->
	<uses-permission android:name="android.permission.CAMERA" />
	<!-- SD卡创建与删除文件权限-->
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
	<!-- 配置SD卡权限-->
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

十七、反编译

1、反编译 apk 得到 java 源代码

首先要下载两个工具:dex2jar和jd-gui

前者是将 apk 中的 classes.dex 转换成 jar 文件,而 jd-gui 是一个反编译工具,可以查看jar包的源代码。

下载地址:

dex2jar:http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip

jd-gui:http://laichao.googlecode.com/files/jdgui.zip

具体步骤:

首先将apk文件的后缀名改为zip,再解压,得到其中的classes.dex文件,它就是java文件编译再通过dx工具打包而成的;

解压下载的dex2jar工具,将classes.dex文件复制到d2j-dex2jar.bat所在的目录中;

在命令行定位到dex2jar.bat所在目录:cd C:\Documents and Settings\Administrator\桌面\反编译工具\dex2jar-2.0

运行d2j-dex2jar.bat生成classes-dex2jar.jar文件:d2j-dex2jar ./classes.dex

解压下载的jd-gui工具运行jd-gui.exe,打开前面生成的jar文件,即可看到源码了

十八、应用加密混淆

1、打开project.properties文件,解开proguard.config的注释,定义sdk.dir=和proguard.config=

sdk.dir为sdk的安装路径:sdk.dir=D:/Android/SDK/android-sdk

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

2、保留所有具有公有访问权限的类的其公共成员

-keepclasseswithmembers class *{
	public *;
}

3、删除Log代码

-assumenosideeffects class android.util.Log {
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
    public static *** d(...);
    public static *** e(...);
}