02_四大应用组件之Activity
1 Activity理解
1.1 组件的特点
- 它的类必须实现特定接口或继承特定类 。
- 需要在配置文件中配置其全类名 。
- 它的对象不是通过new来创建的, 而是系统自动创建的。
- 它的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法。
1.2 Actvity的定义
Activity用来提供一个能让用户操作并与之交互的界面。
一个应用有多个界面, 也就是包含多个Activity。
1.3 Activity和servlet的对比
1.4 Intent和IntentFilter的理解
1.4.1 Intent的理解
1.4.2 Intent的分类
1.4.3 IntentFilter的理解
1.5 相关API
1.6 案例
1.6.1 案例说明
1.6.2 项目
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" >
<EditText android:id="@+id/editText_main" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/texthit">
<requestFocus />
</EditText>
<Button android:id="@+id/button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button01" />
<Button android:id="@+id/button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button02" />
</LinearLayout>
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/editText_second" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="@string/secondActivity_param">
<requestFocus />
</EditText>
<Button android:id="@+id/returnButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/secondActivity_button01" android:onClick="back1"/>
<Button android:id="@+id/returnButton02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/secondActivity_button02" android:onClick="back2"/>
</LinearLayout>
参数设置MainActivity.java
package com.shenju.test002;
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;
public class MainActivity extends Activity implements OnClickListener{
private EditText editText_main;
private Button button01;
private Button button02;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取元素对象
editText_main = (EditText) findViewById(R.id.editText_main);
button01 = (Button) findViewById(R.id.button01);
button02=(Button) findViewById(R.id.button02);
//设置监听 this指的是当前方法所在类的类型 ----MainActivity对象
button01.setOnClickListener(this);
button02.setOnClickListener(this);
}
/** * View对象就是监听的对象 比如button01 button02 */
@Override
public void onClick(View v) {
if(v==button01){
//创建显式的Intent对象
Intent intent=new Intent(this,SecondActivity.class);
//携带参数
String message=editText_main.getText().toString();
intent.putExtra("message", message);
//启动activity
startActivity(intent);
}else if(v==button02){
//带回调的启动
//显式创建Intent
Intent intent =new Intent(this, SecondActivity.class);
editText_main=(EditText) editText_main.findViewById(R.id.editText_main);
String message=editText_main.getText().toString();
intent.putExtra("message", message);
//请求编码随便设置
int requestCode=1;
//带回调的启动
startActivityForResult(intent, requestCode);
}
}
/** * 回调方法 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//判断requestCode和resultCode
if(requestCode==1&&resultCode==2){
//获取值
String message=data.getStringExtra("message");
//设置值
editText_main=(EditText) editText_main.findViewById(R.id.editText_main);
editText_main.setText(message);
}
}
}
SecondActivity.java
package com.shenju.test002;
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;
public class SecondActivity extends Activity{
private EditText editText_second;
private Button returnButton01;
private Button returnButton02;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
editText_second=(EditText) findViewById(R.id.editText_second);
//得到intent对象
Intent intent= getIntent();
//获取message
String message=intent.getStringExtra("message");
//显示message
editText_second.setText(message);
returnButton01=(Button) findViewById(R.id.returnButton01);
}
public void back1(View v) {
finish();
}
public void back2(View v) {
//获取值
editText_second=(EditText) editText_second.findViewById(R.id.editText_second);
String message=editText_second.getText().toString();
//设置intent 传递数据
Intent intent=new Intent();
intent.putExtra("message", message);
//设置结果编码
int resultCode=2;
//设置值
setResult(resultCode, intent);
//关闭当前界面返回上一个界面
finish();
}
}
注意:
设置监听有四种方式
第一种:
//给button设置点击监听
btn_main_download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击要执行的代码
//1 提示开始下载的文本小提示
//如何得到外部类对象,外部类名.this
//Toast提示小文本类
Toast.makeText(MainActivity.this, "开始下载...",Toast.LENGTH_SHORT).show();
//更新button文本
btn_main_download.setText("正在下载中...");
}
});
}
第二种:
第三种:第四种:
2 Activity的使用
2.1 启动一个Activity
从上图我们可以得知:每一个activity的启动,并不是我们自己进行启动,而是通过activityManager来进行启动。
2.2 Activity的生命周期
2.2.1 Activity界面的四种状态
2.2.2 Activity的生命周期回调方法
2.2.3 Activity的生命周期图
2.2.4Activity生命周期与状态
3 Activity的TaskStack(任务栈)和launchMode(加载模式)
3.1 TaskStack说明
- 在Android中,系统用Task Stack (Back Stack)结构来存储管理启动的Activity对象。
- 一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象。
- 只有最上面的任务栈的栈顶的Activity才能显示在窗口中。
3.2 launchMode说明
- 在Android中, 启动一个Activity有时需要总是创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定。
- launchMode属性值(4个)为:
standard:
标准模式,每次调用startActivity()方法就会产生一个新的实例。
singleTop:
如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。
singleTask:
只有一个实例, 默认在当前Task中。
singleInstance:
只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象。
4 应用练习
4.1 说明
4.2 代码
项目结构
界面布局
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" >
<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:layout_weight="1" android:ems="10" android:hint="请输入号码">
<requestFocus />
</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:layout_weight="1" android:ems="10" android:hint="请输入短信">
<requestFocus />
</EditText>
</LinearLayout>
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" >
<Button android:id="@+id/btn_call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打电话" />
<Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发短信" />
</LinearLayout>
</LinearLayout>
MainActivity.java
package com.shenju.test003;
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_call;
private Button btn_send;
private OnClickListener onClickListener=new OnClickListener() {
@Override
public void onClick(View v) {
if(v==btn_call){
//注意如果写this的话不行 因为该方法在OnClickListener类中 而不是MainActivity中
Toast.makeText(MainActivity.this,"点击打电话",0).show();
String number=et_main_number.getText().toString();
//创建一个隐式的Intent
String action=Intent.ACTION_DIAL;
Intent intent=new Intent(action);
//携带数据
intent.setData(Uri.parse("tel:"+number));
//启动activity
startActivity(intent);
}else if(v==btn_send){
Toast.makeText(MainActivity.this,"点击发短信",0).show();
//获取号码和内容
et_main_number= (EditText) et_main_number.findViewById(R.id.et_main_number);
et_main_sms=(EditText) et_main_sms.findViewById(R.id.et_main_sms);
String number =et_main_number.getText().toString();
String sms=et_main_sms.getText().toString();
//创建隐式的Intent,并设置号码和短信内容
Intent intent=new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:"+number));
intent.putExtra("sms_body", sms);
startActivity(intent);
}
}
};
@Override
protected 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_call= (Button) findViewById(R.id.btn_call);
btn_send=(Button) findViewById(R.id.btn_send);
//给视图对象设置点击监听
btn_call.setOnClickListener(onClickListener);
btn_send.setOnClickListener(onClickListener);
//设置长按监听
btn_call.setOnLongClickListener(this);
btn_send.setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View v) {
if(v==btn_call){
Toast.makeText(MainActivity.this,"长按打电话",0).show();
Intent intent=new Intent(Intent.ACTION_CALL);
et_main_number=(EditText) et_main_number.findViewById(R.id.et_main_number);
String number = et_main_number.getText().toString();
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
}else if(v==btn_send){
Toast.makeText(MainActivity.this,"长按发短信",0).show();
//首先获取数据
et_main_number=(EditText) et_main_number.findViewById(R.id.et_main_number);
et_main_sms=(EditText) et_main_sms.findViewById(R.id.et_main_sms);
String number=et_main_number.getText().toString();
String sms=et_main_sms.getText().toString();
SmsManager smsManager=SmsManager.getDefault();
smsManager.sendTextMessage(number, null, sms, null, null);
}
return true;//true表示此事件已经被消费了,不会再触发点击事件
}
}
AndroidManifest.xml
重点是权限设置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shenju.test003" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<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" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
还没有评论,来说两句吧...