Android四大组件之Activity一(组件的概念、Intent、监听)
前言知识补充:
什么是组件?
1.它的类必须实现特定接口或继承特定类
2.需要在配置文件中配置其全类名
3.它的对象不是通过new来创建的, 而是系统自动创建的
4.它的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法
一、什么是Activity?
Activity, 直译为活动, 它是Android定义的四大应用组件之一,也是最重要用得最多的.
Activity用来提供一个能让用户操作并与之交互的界面
Activity的API:
startActivity(Intent intent): 一般启动Activity
startActivityForResult(int reqCode, Intent intent): 带回调启动Activity
onActivityResult(int reqCode, int resultCode, Intent data): 回调方法
setResult(int resultCode, Intent data): 设置要返回的结果
finish(): 结束当前Activity
getIntent(): 得到启动Activity的意图
二、Intent
1.什么是Intent?
Intent, 直译为意图, 也就是你想要做什么或想要去哪?
2.Intent有什么作用?
Intent是Activity, Service和BroadcastReceiver这三个应用组件之间进行通信的信使,意图对象还可以携带数据
3.Intent的分类
显示意图 : 明确指定的目标组件的意图
创建对象 : Intent(Context context, Class clazz)
何时使用 : 当操作当前自己应用的组件时使用
隐式意图 : 没有明确指定目标组件的意图
创建对象 : Intent(String action)
何时使用 : 当操作其它应用的组件时使用
4.Intent的API:
Intent(Context packageContext, Class<?> cls) : 用于创建显示意图对象
Intent(String action): 用于创建隐式意图对象
putExtra(String name, Xxx value): 保存额外数据
Xxx getXxxExtra(String name): 获取额外数据
setData(Uri data): 设置有特定格式的uri数据
注意: Intent不是Android中的四大应用组件之一
三、监听(listener)
1.单击监听:setOnClickListener(OnClickListener listener)
1).方式一: Activity中添加监听:
view.setOnClickListener(OnClickListener listener);
2).方式二: 布局添加监听:
layout中: android:onclick=“方法名”
Activity中: public void 方法名(View v) { }
2.长按监听:setOnLongClickListener(OnLongClickListener listener)
注意:长按监听 只能在Activity中添加监听,不能在布局添加监听
下面 一个小案例 测试:
activity_main.xml 代码
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent" 4 android:orientation="vertical" > 5 6 <EditText 7 android:id="@+id/edt_main_text1" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:hint="请输入用户名"> 11 <requestFocus /> 12 </EditText> 13 14 <Button 15 android:id="@+id/btn_main_start1" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:text="一般启动" /> 19 20 <Button 21 android:id="@+id/btn_main_start2" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="带参数启动" /> 25 26 <ProgressBar 27 android:id="@+id/pb_main" 28 style="?android:attr/progressBarStyleLarge" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content"/> 31 32 </LinearLayout>
MainActivity.java 代码
1 package com.example.android_activity_01; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 import android.widget.EditText; 10 import android.widget.ProgressBar; 11 12 public class MainActivity extends Activity implements OnClickListener { 13 private EditText edt_main_text1 ; 14 private Button btn_main_start1 ; 15 private Button btn_main_start2 ; 16 private ProgressBar pb_main ; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 //初始化控件对象 24 edt_main_text1 = (EditText)findViewById(R.id.edt_main_text1) ; 25 btn_main_start1 = (Button)findViewById(R.id.btn_main_start1) ; 26 btn_main_start2 = (Button)findViewById(R.id.btn_main_start2) ; 27 pb_main = (ProgressBar)findViewById(R.id.pb_main) ; 28 29 //设置点击监听 30 btn_main_start1.setOnClickListener(new OnClickListener() {//匿名内部类 31 @Override 32 public void onClick(View v) { 33 // 1.创建 Intent 对象 显示构造方法 34 Intent intent = new Intent(MainActivity.this, TestActivity.class); 35 // 2.启动Activity 36 startActivity(intent); 37 } 38 }) ; 39 40 btn_main_start2.setOnClickListener(this) ;// 实现接口方式 41 42 //设置长按监听 这里也可以像点击监听匿名内部类的方式实现 ,这里是以外部类的方式 43 pb_main.setOnLongClickListener(new OnLongClikckListenerTest(this)) ; 44 } 45 @Override 46 public void onClick(View v) { //v 是发生事件的控件 47 // 1.创建 Intent 对象 显示构造方法 48 Intent intent = new Intent(this, TestActivity.class); 49 // 2.获取文本框中的数据 50 String message = edt_main_text1.getText().toString(); 51 // 3.通过Intent 携带额外的数据 52 intent.putExtra("message", message); 53 // 4.启动带回调Activity 54 int requestCode = 2 ; 55 startActivityForResult(intent, requestCode) ; 56 } 57 58 /** 59 * 回调方法 60 * requestCode:请求令牌 61 * resultCode:响应令牌 62 * */ 63 @Override 64 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 65 super.onActivityResult(requestCode, resultCode, data); 66 if(requestCode==2 && resultCode==3){ //请求令牌和响应令牌 是否一直 67 String result = data.getStringExtra("result") ; // 获取返回数据 68 edt_main_text1.setText(result) ; // 设置数据到文本框中 69 } 70 } 71 }
OnLongClikckListenerTest.java 代码
1 package com.example.android_activity_01; 2 3 import android.content.Context; 4 import android.view.View; 5 import android.view.View.OnLongClickListener; 6 import android.widget.Toast; 7 /* 8 * 定义 长按监听 9 * */ 10 public class OnLongClikckListenerTest implements OnLongClickListener { 11 private Context context ; 12 13 public OnLongClikckListenerTest(Context context){ //构造方法 14 this.context = context ; 15 } 16 17 @Override 18 public boolean onLongClick(View v) { 19 Toast.makeText(context, "我正在使用长按监听", 2).show() ; //显示 20 return true; 21 } 22 }
activity_test.xml 代码
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent" 4 android:orientation="vertical" > 5 6 <EditText 7 android:id="@+id/edt_test_text1" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:hint="请输入用户名"> 11 <requestFocus /> 12 </EditText> 13 14 <!-- 15 这里 单击监听使用的是布局添加监听 16 --> 17 <Button 18 android:id="@+id/btn_test_back1" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:text="一般返回" 22 android:onClick="back1"/> 23 24 <Button 25 android:id="@+id/btn_test_back2" 26 android:layout_width="wrap_content" 27 android:layout_height="wrap_content" 28 android:text="带参数返回" 29 android:onClick="back2"/> 30 31 </LinearLayout>
TestActivity.java
package com.example.android_activity_01; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class TestActivity extends Activity { private EditText edt_test_text1 ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); // 初始化 控件 edt_test_text1 = (EditText)findViewById(R.id.edt_test_text1) ; // 5.等到 Intent 对象 Intent intent = getIntent() ; // 6.获取 Intent 带来的额外数据 String message = intent.getStringExtra("message") ; // 7.显示到 EditText控件中 edt_test_text1.setText(message) ; } /* * 布局监听的两个方法 */ // 一般返回 public void back1(View v){ finish() ;// 关闭当前界面 } // 带参数返回 public void back2(View v) { // 设置一个令牌 int resultCode = 3; // 设置 回调参数 Intent data = new Intent() ; data.putExtra("result", edt_test_text1.getText().toString()) ; setResult(resultCode , data) ; // 关闭当前界面 finish() ; } }
实现效果: