Servlet的理解回顾
组件的特点
Actvity的定义
类比Activity与Servlet
Servlet Activity 组件 服务器端组件 Android客户端组件 规范定义的接口或类 Servlet接口 Activity类 注册 web.xml AndroidManifest.xml 生命周期方法 init()
service()
doGet()
doPost()
destory()
onCreate()
onStart()
onResume()
……
onDestroy()
请求的发出源 浏览器/移动设备 手机屏幕视图
Intent的理解
显式意图 : 明确指定的目标组件的意图
隐式意图 : 没有明确指定目标组件的意图
IntentFilter的理解
Intent: 意图
Activity: 活动
Activity生命周期相关方法
View: 代表视图的根基类
SmsManager: 发送短信的工具类
设置点击监听的3种方式
方式一: Activity中添加监听:
view.setOnClickListener(OnClickListener);
其中:OnClickListener是一个接口实现类的对象
方式二:view.setOnClickListener(this);
然后使得当前操作所在的Activity实现OnClickListener接口
方式三: 布局添加监听:
layout中: android:οnclick=“方法名”
Activity中: public void 方法名(View v) { }
设置长按监听
view.setOnLongClickListener(OnLongClickListener)
测试用例
功能说明:
1. 在界面1点击”一般启动”: 启动界面
2, 并显示界面1中输入的数据 2. 在界面2点击”一般返回”: 返回到界面1
3. 在界面1点击”带回调启动”: 启动界面2, 并显示界面1中输入的数据
4. 在界面2点击”带结果返回”: 返回到界面1, 并显示界面2中输入的数据
编写Activity的基本步骤
启动一个Activity
一般启动
startActivity(Intent intent)
带回调的启动
startActivityForResult(int reqCode, 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()
启动一个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);
}
@Override
public void onClick(View v) {//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). 启动Activity
startActivity(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). 带回调启动Activity
int requestCode = 2;//请求码
startActivityForResult(intent, requestCode);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//判断code
if(requestCode==2 && resultCode==3) {//requestCode 请求码 resultCode 结果码
//从data中取出数据
String result = data.getStringExtra("RESULT");
//显示
et_main_message.setText(result);
}
}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
/**
* 界面二
*
* @author Administrator
*/
public class SecondActivity extends Activity {
private EditText et_second_message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
et_second_message = findViewById(R.id.et_second_message);
//4). 得到intent对象
Intent intent = getIntent();
//5). 通过intent读取额外数据
String message = intent.getStringExtra("MESSAGE");
//6). 显示到EditText
et_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();
}
}
AndroidManifest.xml
strings.xml
L02_Activity
Hello world!
SecondActivity
styles.xml
activity_main.xml
activity_second.xml
Activity界面的四种状态
Activity的生命周期回调方法
Activity的生命周期图
测试用例
1) 界面从“死亡”-->“运行"
2) 界面从“运行”-->“死亡"
3) 界面从“运行”-->“停止"
4) 界面从“停止” -->“运行"
5) 界面从“运行”-->“暂停"
6) 界面从“暂停” -->“运行"
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()");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e("TAG", "onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
Log.e("TAG", "onStart()");
super.onStart();
}
@Override
protected void onResume() {
Log.e("TAG", "onResume()");
super.onResume();
}
@Override
protected void onPause() {
Log.e("TAG", "onPause()");
super.onPause();
}
@Override
protected void onStop() {
Log.e("TAG", "onStop()");
super.onStop();
}
@Override
protected void onRestart() {
Log.e("TAG", "onRestart()");
super.onRestart();
}
@Override
protected void onDestroy() {
Log.e("TAG", "onDestroy()");
super.onDestroy();
}
public void startSecond(View v) {
startActivity(new Intent(this, SecondActivity.class));
}
}
import android.app.Activity;
import android.os.Bundle;
/**
* 界面二
*
* @author Administrator
*
*/
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
activity_main.xml
activity_second.xml
AndroidManifest.xml
strings.xml
L02_Life
Hello world!
SecondActivity
styles.xml
Activity生命周期与状态
一个进程中的多个Activity是以栈的方式存储的
说明
在Android中, 启动一个Activity有时需要创建一个新对象, 有时需要复用已有的对象, 可以通过在配置activity时通过launchMode属性指定。
launchMode属性值(4个)为:
测试用例
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()");
}
@Override
protected 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()");
}
@Override
protected 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()");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
}
}
activity_main.xml
activity_second.xml
activity_third.xml
AndroidManifest.xml
strings.xml
l02_lauchmode
Hello world!
SecondActivity
ThirdActivity
styles.xml
功能描述:
1) 点击”打电话”: 进入拨号界面
2) 长按”打电话”: 直接拨打电话
3) 点击”发短信”: 进入编辑短信界面
4) 长按”发短信”: 直接将短信发送出去
技术点:
1). 布局的设计
2). 点击事件和长按事件监听的添加
3). 使用隐式意图拨打电话,进入拨号界面, 进入发短信界面:
4). 使用SmsMessager发送短信
5). 权限的声明(如打电话, 发短信)
相关API
需要的权限:
拨打电话的 Uri: tel:110
进入短信界面的电话 Uri : smsto:110
携带额外短信数据的标识名为 : sms_body
如何利用Log和系统应用源码来确定意图的action?
添加ActivityManager 的Log日志利用系统应用源码找到对应的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() {
@Override
public 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: +535ms
String 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)); //
//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: +132ms
Intent 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);
}
}
};
@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_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: +570ms
Intent 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;//不会再触发点击事件(表示此事件已经被消费了)
}
}
activity_main.xml
AndroidManifest.xml
strings.xml
App02_Activity
Hello world!
styles.xml