【Android】第二章 四大应用组件之Activity

来源:互联网 发布:证券交易网络 编辑:程序博客网 时间:2024/06/15 00:37

第一节 activity理解

1.1 Servlet的理解回顾

1)  狭义:Servlet是一个interface, 我们的Servlet类都必须是此接口的实现类

2)  广义:Servlet是一种服务器端的组件, 用来处理 客户端(浏览器)提交的请求, 并返回一个响应界面

1.2 组件的特点

1)  它的类必须实现特定接口或继承特定类

2)  需要在配置文件中配置其全类名

3)  它的对象不是通过new来创建的, 而是系统自动创建的

4)  它的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法

1.3 Activity的定义

1)  Activity, 直译为活动, 它是Android定义的四大应用组件之一,也是最重要用得最多的.

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

3)  一个应用有多个界面, 也就是包含多个Activity

4)  打电话,发短信, 拍照,发邮件等功能都是通过Activity来做的

1.4 类比activity和servlet


第二节 理论概述_Intent和IntentFilter的理解

2.1Intent的理解

1)  Intent, 直译为意图, 也就是你想要做什么或想要去哪?

2)  Intent是Activity, Service和BroadcastReceiver这三个应用组件之间进行通信的信使,

3)  例如: 我要在Activity中启动另一个Actvity, 就必须使用Intent对象

4)  意图对象还可以携带数据

5)  注意: Intent不是Android中的四大应用组件之一

2.2 Intent的分类

显示意图 : 明确指定的目标组件的意图

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

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

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

创建对象 : Intent(String action)

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

 

2.3 IntentFilter的理解

在配置Activity时, 可以为Activity指定一个IntentFilter的配置

如果你的Activity希望其它应用能访问到, 需要配置<intent-filter>

如果你想启动其它应用的界面你必须用隐式intent, 且目标界面Activty配置了<intent-filter>

它的作用类似于web中的为Servlet配置的<url-pattern>


2.3 理论概述_相关API

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, intresultCode, Intent data): 回调方法

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

      finish(): 结束当前Activity

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

Activity生命周期相关方法

      onCreate()

     onStart()

     onResume()

     onPause()

     onRestart()

      onStop()

     onDestory()

View: 代表视图的根基类

      setOnClickListener(OnClickListener listener):设置点击监听

     setOnLongClickListener(OnLongListener listener): 设置长按监听

SmsManager: 发送短信的工具类

     staticSmsManager getDefault() : 得到当前对象

    sendTextMessage(...): 发送短信

设置点击监听的2种方式     

方式一:  Activity中添加监听: 

   view.setOnClickListener(OnClickListenerlistener);

方式二:  布局添加监听: 

   layout中:  android:onclick=“方法名”

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

设置长按监听

view.setOnLongClickListener(OnLongClickListenerlistener)

2.5 Activity使用测试_定义Activity


功能说明:

1. 在界面1点击”一般启动”: 启动界面2, 并显示界面1中输入的数据

2. 在界面2点击”一般返回”: 返回到界面1

3. 在界面1点击”带回调启动”: 启动界面2, 并显示界面1中输入的数据

4. 在界面2点击”带结果返回”: 返回到界面1, 并显示界面2中输入的数据

具体操作步骤如下

①首先创建一个Android application,项目名为L02_Activity

②界面布局及源码

<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}" >    <EditText        android:id="@+id/et_main_message"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="请输入您的信息">    </EditText>    <Button        android:id="@+id/btn_main_start1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/et_main_message"        android:text="一般启动" />    <Button        android:id="@+id/btn_main_start2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/btn_main_start1"        android:text="带回调启动" /></RelativeLayout>

③实现activity功能

1)  定义所有需要操作的视图对象并初始化

2)  给视图设置监听

3)  在回调方法中实现逻辑

 package com.xp.l02_activity;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;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();}}}

第五节 activity使用测试_定义activity

5.1实现一般启动

1)定义好界面二

1、布局  

<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}" >    <EditText        android:id="@+id/et_second_message"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentRight="true"        android:layout_alignParentTop="true" >        <requestFocus />    </EditText>    <Button        android:id="@+id/btn_second_back1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/et_second_message"        android:text="一般返回" />     <Button         android:id="@+id/btn_second_back2"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_alignParentLeft="true"         android:layout_below="@+id/btn_second_back1"         android:text="带结果返回" /></RelativeLayout>

2、定义Activity类的子类SecondActivity (包名右键选择other→Android activity)

3、在AndroidManifest.xml配置定义的组件

<activity

           android:name=".SecondActivity"

           android:label="@string/title_activity_second">

       </activity>

4、重写onCreate(),并加载布局

   super.onCreate(savedInstanceState);

     setContentView(R.layout.activity_second);

第六节 Activity使用测试_一般启动和结束

启动一个activity

一般启动

   startActivity(Intent intent)

 

带回调的启动

   startActivityForResult(intreqCode, Intent intent)

    onActivityResult(int reqCode, int resultCode,Intent data)

如何携带额外数据

   intent.putExtra(name, value)

如何获取携带的额外数据

   Xxx intent.getXxxExtra(name)

如何得到启动的intent

   Intent getIntent()

结束一个Activity

一般结束finish()

带结果的结束setResult(int resultCode, Intent data) finish()

启动界面二

1) 创建Intend对象(显示)

2) 通过intent携带额外数据

3) 启动activity

4) 得到intent对象

5) 通过intent对象读取额外数据

6) 显示EditText

具体源码如下

package com.xp.l02_activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;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) {if(v==btn_main_start1){Toast.makeText(this,"一般启动",0).show();//1)创建intent对象Intent intent = new Intent(this, SecondActivity.class);//2). 通过intent携带额外数据String message = et_main_message.getText().toString();intent.putExtra("MESSAGE", message);//3). 启动ActivitystartActivity(intent);}else if(v==btn_main_start2) {//Toast.makeText(this, "带回调启动", 0).show();//1). 创建Intent对象(显式)Intent intent = new Intent(this, SecondActivity.class);//2). 通过intent携带额外数据String message = et_main_message.getText().toString();intent.putExtra("MESSAGE", message);//3). 带回调启动Activityint requestCode = 2;startActivityForResult(intent, requestCode);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {//判断codeif(requestCode==2 && resultCode==3) {//从data中取出数据String result = data.getStringExtra("RESULT");//显示et_main_message.setText(result);}}}

第七节 Activity使用测试_带回调启动与带结果返回

package com.xp.l02_activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;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);//4). 得到intent对象Intent intent = getIntent();//5). 通过intent读取额外数据String message = intent.getStringExtra("MESSAGE");//6). 显示到EditTextet_second_message.setText(message);}public void back1(View v) {//关闭当前界面finish();}public void back2(View v) {//保存一个结果int resultCode = 3;//准备一个带额外数据的intent对象Intent data = new Intent();String result = et_second_message.getText().toString();data.putExtra("RESULT", result);//设置结果setResult(resultCode, data );//关闭当前界面finish();}}

第八节 Activity使用测试_Activity的启动流程

启动一个Activity的流程图

第九节 Activity界面的四种状态

运行状态: 可见也可操作

暂停状态: 可见但不可操作

停止状态: 不可见,但对象存在

死亡状态: 对象不存在

第十节 Activity生命周期_测试

10.1 activity的生命周期回调方法

onCreate()

onStart()

onResume()

onPause()

onRestart()

onStop()

onDestory()

10.2 activity的生命周期图

package com.xp.l02_life;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;/** *测试用例  * @author Administrator 1)界面从“死亡”-->“运行"     创建对象-->onCreate()-->onStart()-->onResume()---可见可操作(运行状态)2) 界面从“运行”-->“死亡"     onPause()-->onStop()-->onDestroy()-->Activity对象成为垃圾对象---不可见也不存在死亡状态)3) 界面从“运行”-->“停止"     onPause()-->onStop()---不可见但存在4) 界面从“停止” -->“运行"    onRestart()-->onStart()-->onResume()5) 界面从“运行”-->“暂停"     onPause()6) 界面从“暂停” -->“运行"   onResume()   重要的:   1. onCreate(): 在Activity对象创建后调用, 只执行一次   2. onDestroy(): 在Activity死亡之前调用, 只执行一次   3. onResume(): 界面只有经历此方法才能可见可操作 */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 onRestart() {Log.e("TAG", "onRestart()");super.onRestart();}@Overrideprotected void onDestroy() {Log.e("TAG", "onDestroy()");super.onDestroy();}public void startSecond(View v) {startActivity(new Intent(this, SecondActivity.class));}}

Activity生命周期与状态

11_Activity高级特性_Activity的TaskStack

在Android中,系统用Task Stack (Back Stack)结构来存储管理启动的Activity对象

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

只有最上面的任务栈的栈顶的Activity才能显示在窗口中

第十二节 Activity的launchMode

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

launchMode属性值(4个)为:

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

2)  singleTop:如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。

3)  singleTask:只有一个实例, 默认在当前Task中

4)  singleInstance:只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象

测试用例


package com.xp.l02_lauchmode;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;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 startFrist(View v) {startActivity(new Intent(this, MainActivity.class));}}import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;/** * 界面二 * @author Administrator */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 startFrist(View v) {startActivity(new Intent(this, MainActivity.class));}public void startThird(View v) {startActivity(new Intent(this, ThirdActivity.class));}}import android.app.Activity;import android.os.Bundle;import android.util.Log;public class ThirdActivity extends Activity {public ThirdActivity() {Log.e("TAG", "ThirdActivity()");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_third);}}<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.xp.l02_lauchmode"    android:versionCode="1"    android:versionName="1.0" >    <!-- ctrl+shift+x/y -->    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name"            android:launchMode="singleTask" >            <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/title_activity_second"             android:launchMode="singleInstance"/>        <activity            android:name=".ThirdActivity"            android:label="@string/title_activity_third" >        </activity>    </application></manifest>

第十三节 应用练习_界面布局

功能描述:

1). 点击”打电话”:进入拨号界面
2). 长按”打电话”: 直接拨打电话
3). 点击”发短信”: 进入编辑短信界面
4). 长按”发短信”: 直接将短信发送出去

技术点:

1). 布局的设计         

2). 点击事件和长按事件监听的添加

3). 使用隐式意图拨打电话,进入拨号界面, 进入发短信界面: 4). 使用SmsMessager发送短信

5). 权限的声明(如打电话, 发短信)

1. 界面布局

   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>

2. 在Activity中初始化需要操作的视图对象

3. 给button设置点击监听

4. 给button设置长按监听

5. 点击打电话进入拨号界面

   1). 创建一个Intent(隐式)

   2). 携带数据

   3).startActivity(intent)

6. 长按打电话进入打电话的界面

   1). 创建一个Intent(隐式)

   2). 携带数据

   3). startActivity(intent) 

7. 点击发短信进入短信编辑界面

   1). 创建一个Intent(隐式)

   2). 携带数据(号码/内容)

   3).startActivity(intent) 

8. 长按发短信直接发短信

   1). 得到SmsManager的对象

   2). 发送文本信息(短信)

package com.xp.app02_activity;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.telephony.SmsManager;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnLongClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;第十五节 应用练习_添加点击和长按监听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();//1). 创建一个Intent(隐式)//08-28 03:27:09.976: I/ActivityManager(1222): Displayed com.android.dialer/.DialtactsActivity: +535msString action = "android.intent.action.DIAL";action = Intent.ACTION_DIAL;//一样的Intent intent = new Intent(action);//2). 携带数据String number = et_main_number.getText().toString();intent.setData(Uri.parse("tel:"+number)); //<data android:scheme="tel" />//3). startActivity(intent)startActivity(intent);}else if(v==btn_main_send) {//点击发短信Toast.makeText(MainActivity.this, "点击发短信", 0).show();

第十六节 点击进入拨号界面

//1). 创建一个Intent(隐式)//08-28 04:00:02.420: I/ActivityManager(1222): Displayed com.android.mms/.ui.ComposeMessageActivity: +132msIntent intent = new Intent(Intent.ACTION_SENDTO);//android.intent.action.SENDTO//2). 携带数据(号码/内容)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);//3). startActivity(intent)startActivity(intent);}}};@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);}@Override//常按监听public boolean onLongClick(View v) {if(v==btn_main_call) {//长按打电话//Toast.makeText(MainActivity.this, "长按打电话", 0).show();//1). 创建一个Intent(隐式)//08-28 03:38:59.717: I/ActivityManager(1222): Displayed com.android.phone/.PrivilegedOutgoingCallBroadcaster: +570msIntent intent = new Intent(Intent.ACTION_CALL);//android.intent.action.CALL//2). 携带数据String number = et_main_number.getText().toString();intent.setData(Uri.parse("tel:"+number));//3). startActivity(intent)startActivity(intent);

第十八节 长按直接发短信

}else if(v==btn_main_send) {//长按发短信Toast.makeText(MainActivity.this, "长按发短信", 0).show();//1). 得到SmsManager的对象SmsManager smsManager = SmsManager.getDefault();//2). 发送文本信息(短信)String number = et_main_number.getText().toString();String sms = et_main_sms.getText().toString();smsManager.sendTextMessage(number, null, sms, null, null);}return true;//不会再触发点击事件(表示此事件已经被消费了)}}

•     进入电话拨打界面的意图: Intent.ACTION_DIAL

•     进入短信编辑界面的意图: Intent.ACTION_SENDTO

•     拨打电话的意图: Intent.ACTION_CALL

•     发送短信的工具类: SmsManager

•     需要的权限:

   打电话的权限: android.permission.CALL_PHONE

   发短信的权限: android.permission.SEND_SMS

•     拨打电话的Uri: tel:110

•     进入短信界面的电话Uri : smsto:110

•     携带额外短信数据的标识名为: sms_body
















原创粉丝点击