在开始读这篇文章之间,介意你先阅读 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,


    这就是最简单的隐式跳转。其中有一些配置文件在这里说得不是很清楚,就可以官网上去看看,附件中有源码,可以试试。