Android快速入门 四大应用组件之一Activity(打电话和发短信)功能练习
一、理论概述
1、Activity的理解
(1)组件的特点:
- 它的类必须实现特定的接口或继承特定类
- 需要在配置文件中配置其全类名
- 它的对象不是通过new来创建的,而是系统自动创建的
- 它的对象具有一定的生命周期,它的类中有对应的生命周期的回调方法
(2)Activity的定义
- Activity,直接翻译为活动,它是Android定义的四大应用组件之一,它也是最重要的用的最多的
- Activity用来提供一个能让用户操作并与之交互的界面
- 一个应用有多个用户界面,也就是包含多个Activity
- 打电话,发短信,拍照,发邮件等功能都是通过Activity来做的
(3)类比Activity与Servlet
2、Intent和IntentFilter的理解
Intent
(1)Intent的理解
Intent,直译为意图,也就是你想要做什么事情,或者想去哪里?
Intent是Activity,Service和BoradcastReceiver这三个应用组件之间进行通信的信者
例如:我要在Activity中启动另外一个Activity,就必须使用Intent对象
意图对象还可以携带数据
注意:Intent不是Android中的四大应用组件之一
(2)Intent的分类
显示意图:明确指定的目标组件的意图
创建对象:Intent(Context context,Class clazz)
何时使用:当操作当前自己应用的组件时使用
隐式意图:没有明确指定目标组件的意图
创建对象::Intent(String action)
何时使用:当操作其他应用的组件时候使用
IntentFilter
IntentFilter的理解
IntentFilter意图过滤器
3、相关API
二、Activity的开发
1、Activity的使用
测试
(1)创建项目工程
(2)界面布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/et_main_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入您的信息" > <requestFocus /> EditText> <Button android:id="@+id/btn_main_start1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="一般启动" /> <Button android:id="@+id/btn_main_start2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="带回调启动" />LinearLayout>
(3)实现Activity的功能:设计第一个界面
1)定义所有需要操作的视图对象,并初始化
2)给视图设置监听
3)在回调方法当中实现逻辑
package com.itzheng.lo2_activity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/* * 1、布局界面 * 2、实现Activity的功能 * 1)定义所有需要操作的视图对象并初始化 * 2)给视图设置监听 * 3)在回调方法当中实现逻辑 */public class MainActivity extends Activity implements OnClickListener { private EditText et_main_message;private Button btn_main_start1;private Button btn_main_start2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化视图对象 et_main_message = (EditText) findViewById(R.id.et_main_message); btn_main_start1 = (Button) findViewById(R.id.btn_main_start1); btn_main_start2 = (Button) findViewById(R.id.btn_main_start2); //设置点击监听 btn_main_start1.setOnClickListener(this); btn_main_start2.setOnClickListener(this); }@Overridepublic void onClick(View v) { //v就是发生事件的视图对象(操作的视图)if(v==btn_main_start1){ Toast.makeText(this, "一般启动", 0).show();}else if(v==btn_main_start2){ Toast.makeText(this, "带回调的启动", 0).show();}}}
(4)实现Activity的功能:设计第二个界面(实现一般启动)
1)定义好界面二
a、布局
b、定义Activity类
activity_second.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/et_second_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入您的信息" > <requestFocus /> EditText> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="一般返回" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="带结果返回" />LinearLayout>
c、配置好
d、重写onCreate(),方法并加载布局
package com.itzheng.lo2_activity;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class SecondActivity extends Activity { @Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);}}
AndroidManifest.xml当中
<activity android:name="com.itzheng.lo2_activity.SecondActivity" android:label="@string/title_activity_second"> activity>
2)启动界面二
在MainActivity当中
1)创建Intent对象(显示)
2)通过intent额外携带数据
3)启动Activity
package com.itzheng.lo2_activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/* * 1、布局界面 * 2、实现Activity的功能 * 1)定义所有需要操作的视图对象并初始化 * 2)给视图设置监听 * 3)在回调方法当中实现逻辑 */public class MainActivity extends Activity implements OnClickListener { private EditText et_main_message;private Button btn_main_start1;private Button btn_main_start2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化视图对象 et_main_message = (EditText) findViewById(R.id.et_main_message); btn_main_start1 = (Button) findViewById(R.id.btn_main_start1); btn_main_start2 = (Button) findViewById(R.id.btn_main_start2); //设置点击监听 btn_main_start1.setOnClickListener(this); btn_main_start2.setOnClickListener(this); }@Overridepublic void onClick(View v) { //v就是发生事件的视图对象(操作的视图)if(v==btn_main_start1){ Toast.makeText(this, "一般启动", 0).show();//创建Intent对象(显示)Intent intent = new Intent(this, SecondActivity.class);//通过intent额外携带数据String message = et_main_message.getText().toString();intent.putExtra("MESSAGE",message);//启动ActivitystartActivity(intent);}else if(v==btn_main_start2){ Toast.makeText(this, "带回调的启动", 0).show();}}}
在SecondActivity当中
1)得到intent对象
2)通过intent对象读取额外数据
3)显示到EditText当中
package com.itzheng.lo2_activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.EditText;public class SecondActivity extends Activity { private EditText et_second_message;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);et_second_message = (EditText) findViewById(R.id.et_second_message);//得到Intent对象Intent intent = getIntent();//通过intent读取额外数据String message = intent.getStringExtra("MESSAGE");//显示到EditTextet_second_message.setText(message);}}
测试
3)实现一般返回
a、在显示Second界面的时候,Main界面其实还在,只是被覆盖了
b、关闭当前界面(回到上一个界面):finish()
修改activity_second.xml
修改SecondActivity类
4)实现带回调的启动与结果返回
在MainActivity当中
else if (v == btn_main_start2) { Toast.makeText(this, "带回调的启动", 0).show();// 创建Intent对象(显示)Intent intent = new Intent(this, SecondActivity.class);// 通过intent额外携带数据String message = et_main_message.getText().toString();intent.putExtra("MESSAGE", message);// 带回调启动Activityint requestCode = 2;// 请求码startActivityForResult(intent, requestCode);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub// 判断codeif (requestCode == 2 && resultCode == 3) { // 从data当中取出数据String result = data.getStringExtra("RESULT");// 显示出来et_main_message.setText(result);}}
在SecondActivity
public void back2(View v){ //保存结果,准备一个带额外数据的intent对象Intent data = new Intent();data.putExtra("RESULT", et_second_message.getText().toString());int resultCode = 3;//结果码//设置返回的结果setResult(resultCode,data);//关闭当前界面finish();}
测试
(5)启动一个Activity的流程图
2、Activity的生命周期
(1)安卓界面的四种状态
(2)Activity的方法
(3)测试应用理解上诉方法
/* * 1)界面从“死亡”--->“运行” * 2)界面从“运行”--->“死亡” * 3)界面从“运行”--->“停止” * 4)界面从“停止”--->“运行” * 5)界面从“运行”--->“暂停” * 6)界面从“暂停”--->“运行” */public class MainActivity extends Activity { public MainActivity() { Log.e("TAG", "MainActivity()");}@Overrideprotected void onCreate(Bundle savedInstanceState) { Log.e("TAG", "onCreate()");super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overrideprotected void onStart() { Log.e("TAG", "onStart()");super.onStart();}@Overrideprotected void onResume() { Log.e("TAG", "onResume()");super.onResume();}@Overrideprotected void onPause() { Log.e("TAG", "onPause()");super.onPause();}@Overrideprotected void onStop() { Log.e("TAG", "onStop()");super.onStop();}@Overrideprotected void onDestroy() { Log.e("TAG", "onDestroy()");super.onDestroy();}@Overrideprotected void onRestart() { Log.e("TAG", "onRestart()");super.onRestart();}}
- 1)界面从“死亡”—>“运行”:将程序运行即可
创建对象–>创建Activity–>开始运行Activity–>正在运行Activity - 2)界面从“运行”—>“死亡”
点击返回键
暂停(休眠)–>停止–>销毁 - 3)界面从“运行”—>“停止”
点击HOME
暂停–>停止
- 4)界面从“停止”—>“运行”
长按HOME键
从新开始–>开始–>正在运行 - 5)界面从“运行”—>“暂停”
a. 修改布局activity_main界面
添加一个按钮
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="启动界面二" android:onClick="startSecond" />
b.在MainActivity类当中添加方法
public void startSecond(View v){ startActivity(new Intent(this,SecondActivity.class));}
c.创建SecondActivity类
d.修改activity_second.xml
e.修改AndroidManifest.xml
f.运行
暂停
- 6)界面从“暂停”—>“运行”
点空白处
运行
3、Activity的TaskStack
- 只有最上面的任务栈的栈顶的Activity才能显示在窗口当中
4、Activity的launchMode
5、通过创建一个工程来掌握上诉的方法以及内容
创建MainActivity,SecondActivity,
ThreeActivity以及对应的布局文件activity_main.xml,activity_second.xml,activity_three.xml
(1)standard模式
MainActivity
public class MainActivity extends Activity { public MainActivity(){ Log.e("TAG", "MainActivity()");}@Overrideprotected void onCreate(Bundle savedInstanceState) { Log.e("TAG", "onCreate()");super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void startSecond(View v) { startActivity(new Intent(this, SecondActivity.class));}public void startFirst(View v) { startActivity(new Intent(this, MainActivity.class));}}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="界面1111111111" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动界面2" android:onClick="startSecond" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动界面1" android:onClick="startFirst" />LinearLayout>
SecondActivity
public class SecondActivity extends Activity { public SecondActivity(){ Log.e("TAG", "SecondActivity()");}@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);}public void startThree(View v) { startActivity(new Intent(this, ThreeActivity.class));}public void startFirst(View v) { startActivity(new Intent(this, MainActivity.class));}}
activity_second.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="界面22222222222" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动界面3" android:onClick="startThree" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动界面1" android:onClick="startFirst" />LinearLayout>
ThreeActivity
public class ThreeActivity extends Activity { public ThreeActivity(){ Log.e("TAG", "ThreeActivity()");}@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_three);}}
activity_three.xml
<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="${relativePackage}.${activityClass}" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="界面3333" />RelativeLayout>
测试
运行结果
(2)singleTop(顶部单例)模式
修改AndroidManifest.xml
android:launchMode="singleTop"
启动界面后在主界面上点击启动界面1没有反应,在界面2 点击启动界面1的时候,会重新创建一个界面1
(3)singleTask模式
无论在什么位置点击启动界面1只会创建一个界面1,将界面2销毁了
(4)singleInstance
点击界面2,启动界面2,点击界面3,启动界面3,点击返回则启动界面1,点击返回启动界面2
设置singleInstance的界面会新栈,之前创建的栈当中没有界面2,只有界面3和界面1
总结
三、功能练习
1、打电话和发短信(工程搭建以及界面布局)
(1)创建App02_Activity
(2)界面布局
1)分析界面结构:垂直的LinearLayout(内水平的LinearLayout)
2)编写代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="电话号码:" /> <EditText android:id="@+id/et_main_number" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入号码"> EditText> LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="短信内容:" /> <EditText android:id="@+id/et_main_sms" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入短信"> EditText> LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/btn_main_call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打电话" /> <Button android:id="@+id/btn_main_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发短信" /> LinearLayout>LinearLayout>
(3)在Activity当中初始化需要操作的视图对象
MainActivity
package com.itzheng.app02_activity;import android.app.Activity;import android.os.Bundle;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity { private EditText et_main_number;private EditText et_main_sms;private Button btn_main_call;private Button btn_main_send;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化视图对象et_main_number = (EditText) findViewById(R.id.et_main_number);et_main_sms = (EditText) findViewById(R.id.et_main_sms);btn_main_call = (Button) findViewById(R.id.btn_main_call);btn_main_send = (Button) findViewById(R.id.btn_main_send);}}
(4)给视图当中的button设置点击监听 ,给视图当中button设置长按监听
public class MainActivity extends Activity implements OnLongClickListener { private EditText et_main_number;private EditText et_main_sms;private Button btn_main_call;private Button btn_main_send;private OnClickListener onClickListener = new View.OnClickListener() { @Overridepublic void onClick(View v) { if (v == btn_main_call) { // 点击的是打电话Toast.makeText(MainActivity.this, "点击打电话", 0).show();} else if (v == btn_main_send) { // 点击发短信Toast.makeText(MainActivity.this, "点击发短信", 0).show();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化视图对象et_main_number = (EditText) findViewById(R.id.et_main_number);et_main_sms = (EditText) findViewById(R.id.et_main_sms);btn_main_call = (Button) findViewById(R.id.btn_main_call);btn_main_send = (Button) findViewById(R.id.btn_main_send);// 给视图对象设置点击监听btn_main_call.setOnClickListener(onClickListener);btn_main_send.setOnClickListener(onClickListener);// 给视图对象设置长按监听btn_main_call.setOnLongClickListener(this);btn_main_send.setOnLongClickListener(this);}@Overridepublic boolean onLongClick(View v) { if (v == btn_main_call) { // 长按打电话Toast.makeText(this, "长按打电话", 0).show();} else if (v == btn_main_send) { // 长按发短信Toast.makeText(this, "长按发短信", 0).show();}return true;}}
2、实现打电话
(1)实现点击打电话,进入拨打的界面:修改MainActivity的onClick
a、创建一个Intent(隐式);
b、携带数据
c、startActivity(intent);
在模拟器当中启动电话,观察LogCat当中的ActivityManger对应的内容
@Overridepublic void onClick(View v) { if (v == btn_main_call) { // 点击的是打电话// Toast.makeText(MainActivity.this, "点击打电话", 0).show();// a、创建一个Intent(隐式);String action = "android.intent.action.DIAL";action = Intent.ACTION_DIAL;// 和上面的android.intent.action.DIAL一样Intent intent = new Intent(action);// b、携带数据String number = et_main_number.getEditableText().toString();intent.setData(Uri.parse("tel:" + number));//tel:固定前缀 // c、startActivity(intent);startActivity(intent);} else if (v == btn_main_send) { // 点击发短信Toast.makeText(MainActivity.this, "点击发短信", 0).show();}}
(2)长按“打电话”:直接进入拨打电话界面修改MainActivity的onLongClick
a、创建一个Intent(隐式);
b、携带数据
c、startActivity(intent);
@Overridepublic boolean onLongClick(View v) { if (v == btn_main_call) { // 长按打电话//Toast.makeText(this, "长按打电话", 0).show();//a、创建一个Intent(隐式);Intent intent = new Intent(Intent.ACTION_CALL);//android.intent.action.CALL//b、携带数据String number = et_main_number.getEditableText().toString();intent.setData(Uri.parse("tel:"+number));//c、startActivity(intent);startActivity(intent);} else if (v == btn_main_send) { // 长按发短信Toast.makeText(this, "长按发短信", 0).show();}return true;// 表示此事件已经被消费了,不会再触发点击事件}
直接运行会抛出异常,权限被拒绝
(3)添加权限
(4)测试运行
3、实现发短信
(1)实现单击进入短信编辑界面
a、创建一个Intent(隐式);
b、携带数据
c、startActivity(intent);
//Toast.makeText(MainActivity.this, "点击发短信", 0).show();//a、创建一个Intent(隐式);Intent intent = new Intent(Intent.ACTION_SENDTO);//android.intent.action.SENDTO//b、携带数据(号码/内容)String number = et_main_number.getText().toString();String sms = et_main_sms.getText().toString();intent.setData(Uri.parse("smsto:"+number));intent.putExtra("sms_body", sms);//携带额外数据//c、startActivity(intent);startActivity(intent);
(2)实现长按直接发送短信
需要创建另外一个模拟器
a、得到SmsManager对象
b、发送文本信息(短信)
else if (v == btn_main_send) { // 长按发短信Toast.makeText(this, "长按发短信", 0).show();//a、得到SmsManager对象SmsManager manager = SmsManager.getDefault();//b、发送文本信息(短信)String number = et_main_number.getText().toString();String sms = et_main_sms.getText().toString();manager.sendTextMessage(number, null, sms, null, null);}
运行的时候选择5556
直接发送会报错,权限不足,添加发短信的权限
<uses-permission android:name="android.permission.SEND_SMS"/>
5556发送短信
5554接收到短信
三、知识点总结
1、Activity的理解
a、活动:四大应用组件之一
b、作用:提供能让用户操作并与之交互的界面
c、组件:组件的特点
它的类必须实现特定接口或继承特定类需要在配置文件中配置其全类名它的对象不是通过new来创建的,而是系统自动创建的(反射)它的对象具有一定的生命周期,它的类中有对应的生命周期回调方法
d、在应用开发的时候应用到反射的技术:
创建基类其他类继承,并会自动调用子类对应的方法一旦有配置文件就应用到了反射布局文件定义标签,通过标签对应的名称创建对象显示意图:Intent(Context context,Class c)
2、Intent理解
a、意图:信使(Activity,Service,BroadcastReceiver三个组件间的通信)
b、分类:
显示:操作当前应用自己的组件隐式:操作其他应用的组件
3、Intent的实验
a、创建:
显示意图:Intent(Content content,Class activityClass)隐式:Intent(String action)//与Activity与的action匹配
b、携带数据:
额外数据:putExtra(String key,Xxx value)内部用Map容器保存特定前缀的数据:setData(Uri data)//data=tel:21212,smsto:21212c、读取获取数据额外:Xxx getXxxExtra(String key)有特定前缀:Uri getData()
4、Activity的使用
a、定义:
定义一个类extends Activity并重写生命周期方法在功能清单文件当中使用注册
b、启动
启动类型一:一般启动:startActivity(Intent intent)启动类型二:带回调的启动startActivityForResult(Intent intent,int requestCode)重写:onActivityResult(int requestCode,int resultCode,Intent data)
c、结束
一般结束:finish带结果的结束:setResult(int resultCode,Intent data)
5、Activity的生命周期
a、Activity界面的状态
运行状态:可见也可操作暂停状态:可见但不可操作停止状态:不可见,但对象存在死亡状态:对象不存在
b、Activity的生命周期流程:
三个重要的方法
onCreate():加载布局,初始化工作onResume():只有经历此方法,才进入运行状态onDestory();在对象死亡之前调用,做一些收尾或者清理的工作
6、TaskStack和lauchMode
任务栈和加载模式
a、TaskStack(后进先出)
在Android中,系统用Task Stack(Back Stack)结构来存储管理启动的Activity对象一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象只有最上面的任务栈的栈 顶的Activity才能显示在窗口中
b、lunchMode:
standard:标准模式,每次调用startActivity(方法就会产生一个新的实例。singleTop:如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。singleTask:只有一个实例,默认在当前Task中singleInstance:只有一个实例,创建时会新建一个栈,且此栈中不能有其它对象
7、实现一个简单功能应用的步骤:
a:外观:分析界面组成,定义布局文件b:行为:编写Activity的实现在onCreate()中加载布局文件:setContextView(layoutId)调用findViewById得到需要操作的所有视图对象保存成为成员变量给视图对象设置监听器(点击/长按),在回调方法实现响应逻辑2)使用隐式意图启动系统应用的界面如何找到对应的Activity字符串:添加ActivityManager的Log日志,利用系统应用原码找到对应的Activity配置3)权限:当调用一些系统比较重要的功能时候需要声明
更多相关文章
- Android(安卓)AbsListView
- 史上最全!押题率90%的 Android(安卓)中高级工程师面试复习大纲及
- Android(安卓)滑动绘制流程探究 系统是如何提高滑动性能?
- 使用ImageView 加上 Edittext做出自定义的输入框(EditText美化)
- android 如何绕过签名校验
- Android开发指南-用户界面-事件处理
- Android应用优化之内存概念
- Android(安卓)zar高速扫码程序,(比zxing快很多倍),包更小,扫码界面Xml
- List集合和LinkList的讲解