在开始读这篇文章之间,介意你先阅读
Android开发入门(四)之界面Activity。
Activity之间的跳转分为两种一种是显示的,另一种是隐式跳转,推介使用隐式跳转,不过本文两种都会讲解。
在
Android开发入门(四)之界面Activity中源码中已包含了显式跳转。
首先在
Android开发入门(四)之界面Activity中已有一个Activity,这里需在再建一个Activity。
第一步:在项目中res/layout/下添加一个display.xml,内容为
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:id="@+id/DisplayName"/>
8. </LinearLayout>
|
第二步:在com.cmath包下添加一个名叫Display的Activity类,Display.java内容为
1.
2. package com.cmath;
3. import android.app.Activity;
4. import android.content.Intent;
5. import android.os.Bundle;
6. import android.widget.TextView;
7. public class Display extends Activity {
8. @Override
9. public void onCreate(Bundle savedInstanceState) {
10. super.onCreate(savedInstanceState);
11. setContentView(R.layout.display);
12. Intent intent = getIntent();
13. Bundle bundle = intent.getExtras();
14. TextView text = (TextView) findViewById(R.id.DisplayName);
15. text.setText("name:" + bundle.getString("name"));
16. }
17. }
|
这样一个新的Activity就完成了
因为在该项止中我们在
Android开发入门(四)之界面Activity中已建了一个main的Activity,而这里我们的目的就是为了从main跳到Display中。
在main这个Activity中已有一个id为Submit的Button,当点击这个Button后要跳到Display中。修改main.java的代码为
1.
2. package com.cmath;
3. import android.app.Activity;
4. import android.content.Intent;
5. import android.os.Bundle;
6. import android.view.View;
7. import android.widget.Button;
8. import android.widget.EditText;
9. public class main extends Activity {
10. /** Called when the activity is first created. */
11. @Override
12. public void onCreate(Bundle savedInstanceState) {
13. super.onCreate(savedInstanceState);
14. setContentView(R.layout.main);
15. final EditText name = (EditText) findViewById(R.id.TextName);
16. final Button submit = (Button) findViewById(R.id.Submit);
17. submit.setOnClickListener(new Button.OnClickListener() {
18. @Override
19. public void onClick(View v) {
20. Intent intent = new Intent();
21. intent.putExtra("name", name.getText().toString());//添加一些内容,传给Display
22. intent.setClass(v.getContext(), Display.class);//指明要跳转的Activity类
23. startActivity(intent);
24. }
25. });
26. }
27. }
|
在上面代码中启动跳转作用的是
1.
2. intent.setClass(v.getContext(), Display.class);//指明要跳转的Activity类
3. startActivity(intent);
|
在intent.setClass方法中指明跳到哪个Activity,v.getContext()指当前的Activity,Display.class指将在跳到的Activity
startActivity(intent) 执行跳转。
下面介绍隐式的跳转,隐式的跳转会出显式的跳转复杂一点,但是会更有用!
首先说到隐式跳转,会使用到ContentProvider。ContentProvider会在以后的文章中说到,这里只是简单说明。
第一步:在com.cmath包下建立CmathProvide.java,内容为:package com.cmath;
1.
2. import android.content.ContentProvider;
3. import android.content.ContentValues;
4. import android.database.Cursor;
5. import android.net.Uri;
6. import android.util.Log;
7. public class CmathProvider extends ContentProvider {
8. @Override
9. public int delete(Uri arg0, String arg1, String[] arg2) {
10. // TODO Auto-generated method stub
11. Log.e("fffff", "fffff");
12. return 0;
13. }
14. @Override
15. public String getType(Uri uri) {
16. return "vnd.cmath.name/vnd.cn.cmath";
17. }
18. @Override
19. public Uri insert(Uri uri, ContentValues values) {
20. // TODO Auto-generated method stub
21. Log.e("ddddd", "dddd");
22. return null;
23. }
24. @Override
25. public boolean onCreate() {
26. // TODO Auto-generated method stub
27. Log.e("cccc", "ccccc");
28. return false;
29. }
30. @Override
31. public Cursor query(Uri uri, String[] projection, String selection,
32. String[] selectionArgs, String sortOrder) {
33. Log.e("bbbbb", "bbbb");
34. return null;
35. }
36. @Override
37. public int update(Uri uri, ContentValues values, String selection,
38. String[] selectionArgs) {
39. Log.e("aaaa", "bbbb");
40. return 0;
41. }
42. }
|
这些方法很简单,都是Override ContentProvider 的方法,有一定程序经验的一看就知道,这些都是CRUD方法,ContentProvider就是内容管理。
第二步:修改项目根目录下的AndroidManifest.xml文件为:
1. <?xml version="1.0" encoding="utf-8"?>
2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3. package="com.cmath"
4. android:versionCode="1"
5. android:versionName="1.0.0">
6. <application android:icon="@drawable/icon" android:label="@string/app_name">
7.
8. <provider android:name="CmathProvider" android:authorities="com.cmath.provider.name"/>
9.
10. <activity android:name=".main" android:label="@string/app_name">
11. <intent-filter>
12. <action android:name="android.intent.action.MAIN" />
13. <category android:name="android.intent.category.LAUNCHER" />
14. </intent-filter>
15. </activity>
16. <activity android:name=".Display">
17. <intent-filter>
18. <action android:name="android.intent.action.EDIT" />
19. <category android:name="android.intent.category.DEFAULT" />
20. <data android:mimeType="vnd.cmath.name/vnd.cn.cmath" />
21. </intent-filter>
22. </activity>
23. </application>
24. </manifest>
|
第三步:修改main中button的处理事件代码
1.
2. submit.setOnClickListener(new Button.OnClickListener() {
3. @Override
4. public void onClick(View v) {
5. Intent intent = new Intent();
6. intent.putExtra("name", name.getText().toString());
7. intent.setAction(Intent.ACTION_EDIT);
8. intent.setData(Uri.parse("content://com.cmath.provider.name/test"));
9. startActivity(intent);
10. }
11. });
|
到这里代码修改就完成了。
下面来具体讲解一下整个程序的运行过程。在讲解之前在说明一下,Android的隐式跳转是基于事件的,有系统预定义的,也可以自定义。
首先我们从这个程序开始后按下main中的Button说起。
第一步:按下Button,执行上面onClick方法,在这个方法中初始化Intent,然后调用setAction添加EDIT事件,setData设置Uri。最后调用startActivity。
第二步:当调用startActivity后,一切都Android内部处理了。
到了这里需在明白AndroidManifest.xml中
1. <provider android:name="CmathProvider" android:authorities="com.cmath.provider.name"/>
|
这是一个Provider配置:android:name指类名,就是我们建的CmathProvider类(包名在manifest xmlns标签中已指明)
可能到了这里有人已发现
1. intent.setData(Uri.parse("content://com.cmath.provider.name/test"));
|
中有内容和android:authorities内容相同,的确
1. content://com.cmath.provider.name/test
|
是一个固定格式,以content:// 开始,再加一个Provider的android:authorities,以某个自定义字符结束,就构成了
1. content://[android:authorities]/[notes]
|
上面程序中Android会根据content://com.cmath.provider.name/test中的"com.cmath.provider.name"去匹配android:authorities,
就到找到CmathProvider,再调用getType方法。
第三步:getType返回一个"vnd.cmath.name/vnd.cn.cmath“
再看看activity配置
1.
2. <activity android:name=".Display">
3. <intent-filter>
4. <action android:name="android.intent.action.EDIT" />
5. <category android:name="android.intent.category.DEFAULT" />
6. <data android:mimeType="vnd.cmath.name/vnd.cn.cmath" />
7. </intent-filter>
8. </activity>
|
根据getType返回的"vnd.cmath.name/vnd.cn.cmath“ 和 intent.setAction(Intent.ACTION_EDIT)可以找到Display这个Activity。这样就可以确定要跳转的Activity,
这就是最简单的隐式跳转。其中有一些配置文件在这里说得不是很清楚,就可以官网上去看看,附件中有源码,可以试试。