第一章
1.1 Android中src文件夹包含项目的所有包及其资源文件,res文件夹包含了项目中所有的资源。比如:程序图标(drawable),布局文件(layout),常量(value),音频文件(raw)
R.java是在创建项目是自动生成的只读文件,不可更改此文件。R文件其作用:是定义项目中所有资源的索引文件。
1.2 AndroidManfest.xml 如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest //根节点,描述了packege包中所有的内容
xmlns:android="http://schemas.android.com/apk/res/android" //包命名空间的声明,使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据
package="Android.Summary" //引用程序包名
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" /> //使用SDK版本号
<application //包含package中application级别组件声明的根节点,可包含application的一些全局和默认的属性,如标签label,icon,主题,必要的全限。注意:一个manifest中只能包含一个或0个application
android:icon="@drawable/icon" //应用程序图标
android:label="@string/app_name"> //应用程序名字
<activity android:name=".SummaryActivity" //Activity用来与用户交互的主要工具,是用户打开程序的初始界面.此处为引用程序默认启动的Activity
android:label="@string/app_name">
<intent-filter>/ //描述了Activity的启动时间和位置,另外为了支持查找Activity可以包含一个或多个<intent-filter>
<action android:name="android.intent.action.MAIN" /> //acton 为组件支持的Intent action
<category android:name="android.intent.category.LAUNCHER" />//categor 为组件支持的Intent category 这里指定了引用程序的默认启动的Activity
</intent-filter>
</activity>
<activity android:name = "Activity02"></activity> //在此对新增的Activity进行注册。如果在不同的包中注意声明是将包名带上
</application>
</manifest>
1.3 String.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<resources> //此处定义了两个字符串资源,即定义了app_name,hello常量
<string name="hello">Hello World, SummaryActivity!</string>
<string name="app_name">Summary</string>
</resources>
如何使用这个资源呢?如下:
Resources r = this.getContext().getResources(); //通过Context的getResource()实例化一个Resources对象
String app_name = ((String)r.getString(R.string.app_name)); //然后通过getString()方法取得指定的索引的字符串。项目中所有常量都可以在String.xml文件中定义
String hello = ((String)r.getString(R.string.hello));
1.4 main.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"//LinearLayout 线程版面配置
android:orientation="vertical" //版面配置的方式。此为自上到下为垂直配置,"horizontal"为水平配置
android:layout_width="fill_parent" //定义当前视图在屏幕上所占的宽度,"fill_parent"为填充整个屏幕宽度
/*android:layout_weight="50"*/ //用于给一个布局中多个视图的重要度赋值
android:layout_height="fill_parent" //定义当前视图在屏幕上所占的高度,...........................高度
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content" //随着视图的栏位的不同而改变这个视图的高度或宽度
android:text="@string/hello" //在视图上显示的内容,此处引用了@String中的hello字符串
/>
</LinearLayout>
1.5 src下的java 如下:
package Android.Summary;
import android.app.Activity;
import android.os.Bundle;
public class SummaryActivity extends Activity { //继承自Activity
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState){ //重写onCreate()方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //设置要显示的布局
}
}
第二章
2.1 Android应用程序由四个模块组成:Activity,Service,Intent,ContentProvider(注意:一个应用程序不一定包含全部的四个模块).
在使用时必须在AandroidManfest中进行声明。
Activity可以理解为用户看到屏幕,主要用于处理应用程序的整体性工作。如:
a.监听系统事件,触屏事件,为用户显示指定的View,启动其他Activity等。
b.所有应用的Activity都继承于android.app.Activity,该类是Android提供的基层类。
c.一个Activity通常就是一个单独的屏幕。
d.每一个活动都被实现为一个独立的类。
e.大多数的应用程序都是由多个Activity组成。
Intent Aandroid中主要用Intent类实现从一个Activity跳转到另一个Activity。在Intent的描述结构中,有两个重要的部分:动作和对应的数据。
典型的动作有MAIN,VIEW,PICK,EDIT.而动作对应的数据则以URI的形式表示。例如:要查一个人的联系方式,需要创建一个动作类型View的Intent
,以及一个表示这个人的URI.
Intent的使用:
button1.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent(); //创建一个Intent对象
intent.setClass(Activity01.this,Activity02.class);//指明要启动的另一Activity02
startActivity(intent); //启动一个新的Activity
Activity01.this.finish(); //关闭当前Activity01
}
});
这里需要注意在Android中对新启动的Activity进行声明。声明方式:
<activity android:name = "Activity02"></activity> //注意:如果在不同的包中在声明是还要加上包名
IntentReceiver
如果希望Android应用能够对外部事件(如电话打入时,数据网络可用时,)做出响应,可用使用IntentReceiver.虽然IntentReceiver在如上事件发生
时会使用NotificationManager通知用户,但它并不能生产UI。IntentReceiver可以在AndroidManifest.xml中注册,也可在代码中使用Context.registerReceiver
进行注册。当IntentReceiver被触发时,系统会在需要的时候启动应用。各种应用还可以通过ContentReceiver()将他们自己的IntentReceiver广播出去。 ???????
Content Provider
作用:主要用于不同应用程序中的数据的传递。
Content Provider 是一个特殊的存储数据的类型。
Android自身提供现成的Content Provider:Contacts ,Browser,CallLog,Settings,MediaStore
应用可用通过唯一的ContentResolver界面来使用具体的Conten Provider,然后可以用ContentResolver提供的方法来使用你需要的Content Provider
其中,ContentResolver提供的方法有query(),insert(),update()等。
URI----String形式的Content Provider的完整路径。
下面这个这个例子通过ContentProvider获取电话本中的数据,然后显示到TextView中去。
public class Activity01 extends Activity{
public void onCreate(Bundle savedInstanceState){
TextView textView = new TextView(this);//得到TextView对象
String string = "";
super.onCreate(savedInstanceState);
ContentResolver resolver = getContentResolver();//得到ContentResolver对象
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);//取得电话本中开始一项的光标,通过query方法查询出符合标准的电话本记录
//向下移动光标
while(cursor.moveToNext()){
//取得联系人名字
int name_index = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);
String name = cursor.getString(name_index);
//取得电话号码
int number_index = cursor.getColumnIndex(PhoneLookup.NUMBER);
String number = cursor.getString(number_index);
string +=(name+":"+number+"\n");
}
cursor.close();
textView.setText(string);//设置TextView显示的内容
setContentView(textView);//显示到屏幕上 其实TextView也是View的一种
}
}
注意:在使用这些模块中用到了读取联系人的API,所以必须在AndroidManifest.xml中声明
声明方式为:
<uses_permission
android:name="android.permission.READ_CONTACTS">
</uses-permission>
Service 后台服务,没有界面
启动service方法:
a.Context.startService()
b.Context.bindService()//与上一种方法不同处 如果这个Service没有处于启动状态,则将其启动
下面这个例子以Activity中的俩个控件来控制播放一首Mp3. (例中:需要在res文件夹中创建一个raw文件夹 然后放入一首MP3)
public class Activity01 extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//从main.xml布局中获得Button对象
Button button_start = (Button)findViewById(R.id.start);
Button button_stop = (Button)findViewById(R.id.stop);
//设置按钮(Button)监听
button_start.setOnClickListener(start);
button_stop.setOnClickListener(stop);
}
//开始按钮
private OnClickListener start = new OnClickListener(){
public void onClick(View v){
//开启Service
startService(new Intent("com.yarin.Android.MUSIC"));
}
};
//停止按钮
private OnClickListener stop = new OnClickListener(){
public void onClick(View v){
//停止Service
stopService(new Intent("com.yarin.Android.MUSIC"));
}
};
}
public class MusicService extends Service{
//MediaPlayer对象
private MediaPlayer player;
public IBinder onBind(Intent arg0){
return null;
}
public void onStart(Intent intent, int startId){
super.onStart(intent, startId);
//这里可以理解为装载音乐文件
player = MediaPlayer.create(this, R.raw.test);
//开始播放
player.start();
}
public void onDestroy(){
super.onDestroy();
//停止音乐-停止Service
player.stop();
}
}
AndroidManifest.xml文件中
<service android:name=".MusicService">
<intent-filter>
<action android:name="com.yarin.Android.MUSIC" />
<category android:name="android.intent.category.default" />
</intent-filter>
</service>
2.2 Aandrod的生命周期
public class Activity02 extends Activity{
private static final String TAG = "Activity02";
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
Log.v(TAG, "onCreate");
}
public void onStart(){
super.onStart();
Log.v(TAG, "onStart");
}
public void onResume(){
super.onResume();
Log.v(TAG, "onResume");
}
public void onPause(){
super.onPause();
Log.v(TAG, "onPause");
}
public void onStop(){
super.onStop();
Log.v(TAG, "onStop");
}
public void onDestroy(){
super.onDestroy();
Log.v(TAG, "onDestroy");
}
public void onRestart(){
super.onRestart();
Log.v(TAG, "onReStart");
}
}
这些方法都是系统自动调用的。
第三章
3.1 事件处理
* 控件事件通过设置其控件的监听器来监听并处理事件
* 按键按下事件:通过重写onKeyDown方法
* 按键弹起事件:通过重写onKeyUp方法
* 触笔点击事件:通过实现onTouchEvent方法
* 示例中使用了Toast控件:
* Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
public class Activity01 extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得Button对象
Button button_ok = (Button) findViewById(R.id.ok);
button_ok.setOnClickListener(new Button.OnClickListener() {-------------------------------------------------------//设置Button控件监听器
public void onClick(View v){
//这里处理事件
DisplayToast("点击了OK按钮");
}
});
}
/* 按键按下所触发的事件*/
public boolean onKeyDown(int keyCode, KeyEvent event){
switch (keyCode){
case KeyEvent.KEYCODE_DPAD_CENTER:
DisplayToast("按下:中键");
break;
case KeyEvent.KEYCODE_DPAD_UP:
DisplayToast("按下:上方向键");
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
DisplayToast("按下:下方向键");
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
DisplayToast("按下:左方向键");
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
DisplayToast("按下:右方向键");
break;
}
return super.onKeyDown(keyCode, event);
}
/* 按键弹起所触发的事件*/
public boolean onKeyUp(int keyCode, KeyEvent event){
switch (keyCode){
case KeyEvent.KEYCODE_DPAD_CENTER:
DisplayToast("弹起:中键");
break;
case KeyEvent.KEYCODE_DPAD_UP:
DisplayToast("弹起:上方向键");
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
DisplayToast("弹起:下方向键");
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
DisplayToast("弹起:左方向键");
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
DisplayToast("弹起:右方向键");
break;
}
return super.onKeyUp(keyCode, event);
}
//用于响应按键重复点击,官方API指出onKeyMultiple方法总是返回false,即它没有handle,因此必须重写才能实现-------------------此方法没用过具体情况怎么样不是很清楚?
public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){
return super.onKeyMultiple(keyCode, repeatCount, event);
}
/* 触笔事件*/
public boolean onTouchEvent(MotionEvent event){
int iAction = event.getAction(); //利用getAction得到所执行的动作
if (iAction == MotionEvent.ACTION_CANCEL ||
iAction == MotionEvent.ACTION_DOWN ||
iAction == MotionEvent.ACTION_MOVE){
return false;
}
//得到触笔点击的位置
int x = (int) event.getX();
int y = (int) event.getY();
//将获得的坐标转成String类型的方法
DisplayToast("触笔点击坐标:("+Integer.toString(x)+","+Integer.toString(y)+")");
return super.onTouchEvent(event);
}
/* 显示Toast */
public void DisplayToast(String str){
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
}
我们分析了一些常用事件处理方式。每一个键都对应一个键值。当然也可根据需要来改变一些键的功能,需要我们自己构建KeyEvent对象------------------有待进一步学习
构造KeyEvent对象的