合抱之木,生于毫末;百丈之台,起于垒土;千里之行,始于足下。-----《老子》
大家好,经过前面几个小节的总结,相信大家对Android已经有了一个初步的了解,那么从今天开始,我将陆续归纳总结一下Android中比较重要的一个知识点,那就是Android的四大组件的相关内容。此部分内容十分重要,有很多细节值得注意。根据自己平日的学习,还有找工作和工作的经历,我会尽可能将自己知道的,自己觉得应该提到的相关知识点进行归纳总结,但是由于自己也是新手,学习Android时间不长,还属于菜鸟级的,所以其中有什么不妥、错误、或者比较重要的知识点没有提到的,欢迎大家多多吐槽……(废话不多说,走起……)
1、Activity的创建:
第一步:新建一个继承Activity的类,如:NewActivity
public class NewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//这里可以使用setContentView(R.layout.xxx)显示某个视图....
}
}
第二步:需要在功能清单AndroidManifest.xml文件中添加进上面Activity配置代码(红色部分):
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.action"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
.....
<activity android:name=".NewActivity" android:label="新activity的页面标题"/>
</application>
...
</manifest>
android:name属性值的前面加了一个点表示NewActivity是当前包cn.action下的类,如果类在应用的当前包下,可以省略点符号,如果类在应用的子包下必须加点,如:NewActivity类在cn.action.user包下可以这样写:<activity android:name=“.user.NewActivity“ />
2、Activity的开启(显示意图和隐式意图)与关闭:finish()方法完成
(1)、显示意图开启方式:
指定一个类启动Activity,通常用在应用程序内部界面跳转
Intent intent = new Intent(); //创建意图对象
intent.setClass(this, otherActivity.class) //构造函数,代码少
// intent.setClassName(this."com.itheima.activity.OtherActivity"); //类名形式,灵活,可扩展性强
// intent.setClassName("com.itheima.activity","com.itheima.activity.MainActivity"); //包名类名形式,可启动其他程序中的Activity
startActivity(intent); //打开Activity
(2)、隐式意图开启方式:
显示意图是指在创建意图时指定了组件,而隐式意图则不指定组件,通过动作、类型、数据匹配对应的组件。
*** 在清单文件中定义<activity>时需要定义<intent-filter>才能被隐式意图启动。
*** <intent-filter>中至少配置一个<action>和一个<category>,否则无法被启动。
*** Intent对象中设置的action、category、data在<intent-filter>必须全部包含才能启动。
*** <intent-filter>中的<action>、<category>、<data>都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动。
*** 如果一个意图要匹配多个Activity、Android系统会提示选择。
通过动作和数据找到一个匹配的Activity,不和某个类绑定,通常用在多个应用之间跳转
例如:
Intent intent = new Intent();
intent.setAction(“android.intent.action.CALL”);
intent.setData(Uri.parse(“tel:132888888888”));
startActivity(intent);
相对于以上的隐式意图,对应的Activity的配置文件如下:
<activity android:name = “.OtherActivity” //这里是标识是哪个Activity
Android:label = “OtherActivity”> //这里是标识显示在Activity上的标题
<intent-filter>
<action android:name = “android.intent.action.CALL”/>
<category android:name = “android.intent.category.DEFAULT”/>
<data android:scheme=”/tel”/>
</intent-fileter>
</activity>
3、Activity的数据传递相关:
(1)、开启一个Activity时发送数据过去:
a、传递基本数据类型:
传数据:
intent.putExtra(key , value);
取数据:
intent.getStringExtra(“”);
intent.getIntExtra(“”,-1); //获取数据,如果获取的数据不存在,值就是-1.
b、传递一个对象(必须序列化):
传数据:
intent.putExtra(“p”, new Person(“李四”,21));
取数据:
Person p = (Person) intent.getSerializableExtra(”p”);
String name = p.getName();
int age = p.getAge();
c、当想传递一组数据,但是不是一个对象的时候,还可以用以下的方法来完成:
传数据:
Bundle b1 = new Bundle();
b1.putString(“name”,”李四”);
b1.putInt(“age”,20);
intent.putExtra(“b1”,b1);
取数据:
Bundle b1 = intent.getBundleExtra(“b1”);
String name = b1.getString(“name”);
int age = b1.getInt(“age”);
(2)、关闭一个Activity时传回数据:
注意:当要接收传回来的数据的时候,开启Activity就不能用startActivity()这个方法了,而应该用startActivityForResult(intent,100)这个方法了。
startActivity(intent): //开启不接收返回数据
startActivityForResult(intent,100): //开启并接收返回的数据
a、设置Activity关闭时返回的数据
Intent intent = new Intent();
intent.putExtra(“name”,”王五”);
intent.putExtra(“age”,22);
setResult(200,intent);
b、那么当以上的代码执行之后就会将数据返回了,然后开启Activity的方法接收数据并调用另一个方法:
protected void onActivityResult(int requestCode,intresultCode,Intentdata){
……
}
会看到上面的那个方法中有三个参数,分别如下:
requestCode: startActivityForResult方法中传入的int值,用来区别是哪里开启的。
resultCode: setResult方法中传入的int值,用来区别哪里返回的
data: setResult方法中返回的Intent对象
然后到此我们就清楚了这里的数据传输是怎么一回事了。过程大致如下:
(1)、我们通过调用startActivityForResult(intent,100)这个方法开启了一个activity,并将数据传了过去。
(2)、当另外的一个Activity关闭的时候调用setResult(200,intent)这个方法,将数据返回。
(3)、返回来的数据,通过onActivityResult()这个方法接收到,然后进行各种处理。