Intent實現頁面跳轉和傳值


*Intent稱為意圖,是Android各大組件連接的橋梁

1.Activity頁面跳轉

同一個包內

Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); MainActivity.this.startActivity(intent);

不同包內

(1)明確的Intent

Intent intent = new Intent(); ComponentName comp = new ComponentName("包名(應用本身所在的包,通過AndroidManifest.xml中package屬性查看)","包名.類名(Activity所在的包)"); //或者intent.setClassName("包名","包名.類名");
intent.setComponent(comp); startActivity(intent);

(2)不明確的Intent

Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); // 應用程序的入口
intent.addCategory(Intent.CATEGORY_HOME); // 桌面的應用程序
startActivity(intent);

 然后在AndroidManifest.xml中注冊該過濾條件

<activity android:name=".OtherActivity" android:label="OtherActivity" >
    <intent-filter>
        <action android:name="action_name" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

注:

*第一個Activity是外部通過不明確的Intent跳轉的

*要設置第一個被啟動的Activity,需要設置如下屬性
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

2.Activity頁面跳轉傳值

第一種方法:(Intent)

發送方:

Intent intent = new Intent(); intent.putExtra("name", "諸葛亮"); intent.putExtra("age", 50); intent.putExtra("IQ", 200.0f); intent.setClass(MainActivity.this, SecondActivity.class); MainActivity.this.startActivity(intent);

接受方:

Intent intent = getIntent(); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", 0); float IQ = intent.getFloatExtra("IQ", 0.0f); textview2.setText("name:"+name+",age:"+age+",IQ:"+IQ);

第二種方法:(Bundle)

發送方:

Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putString("name", "喬峰"); bundle.putInt("age", 40); bundle.putFloat("weight", 70.4f); intent.putExtras(bundle); intent.setClass(MainActivity.this, SecondActivity.class); startActivity(intent);

接受方:

Intent intent = getIntent(); Bundle bundle = intent.getExtras(); String name = bundle.getString("name"); int age = bundle.getInt("age"); float weight = bundle.getFloat("weight"); textview.setText(name+","+age+","+weight);

第三種方法:(Application)

首先要新建一個繼承Application的MyApp類,補充屬性的get/set方法

AndroidManifest.xml也要配置application的屬性android:name=".MyApp"

發送方:

MyApp myApp = (MyApp) getApplication(); myApp.setName("周星馳"); Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); startActivity(intent);

接受方:

MyApp myApp = (MyApp) getApplication(); String name = myApp.getName(); textview = (TextView) findViewById(R.id.textview); textview.setText(name);

第四種方法:(推薦)

對象類要實現Parclelable接口

發送方:

Intent intent = new Intent(); Person person = new Person("孫悟空",500,55.6f); intent.putExtra("person", person); intent.setClass(MainActivity.this, SecondActivity.class); startActivity(intent);

接受方:

Intent intent = getIntent(); Person person = intent.getParcelableExtra("person"); textview = (TextView) findViewById(R.id.textview); textview.setText(person.toString());

對象類:

public class Person implements Parcelable { private String name; private int age; private float weight; public Person() { super(); // TODO Auto-generated constructor stub
 } public Person(String name, int age, float weight) { super(); this.name = name; this.age = age; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getWeight() { return weight; } public void setWeight(float weight) { this.weight = weight; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", weight=" + weight + "]"; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); dest.writeFloat(weight); } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { public Person createFromParcel(Parcel in) { return new Person(in); } public Person[] newArray(int size) { return new Person[size]; } }; private Person(Parcel in) { name = in.readString(); age = in.readInt(); weight = in.readFloat(); } }

3.頁面返回傳值

被返回方:

startActivityForResult(intent, 38);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Bundle bundle = data.getExtras(); String name = bundle.getString("name"); int age = bundle.getInt("age"); float weight = bundle.getFloat("weight"); Toast.makeText(MainActivity.this, name+age+weight, Toast.LENGTH_LONG).show(); super.onActivityResult(requestCode, resultCode, data); }

返回方:

Intent data = new Intent(); data.setClass(SecondActivity.this, MainActivity.class); Bundle bundle = new Bundle(); bundle.putString("name", "張無忌"); bundle.putInt("age", 20); bundle.putFloat("weight", 120.5f); data.putExtras(bundle); setResult(250, data); finish();

啟動Activity

上下文中,通過如下方法啟動Activity
*startActivity(Intent intent):啟動新的Activity
*startActivityForResult(Intent intent, int requestCode):指定請求碼啟動新的Activity

如果使用startActivityForResult()啟動Activity,則必須重寫onActivityResult()方法,並且該方法第一個參數與requestCode相對應

關閉Activity

上下文中,通過如下方法關閉Activity
*finish():關閉當前Activity
*finishActivity(int requestCode):關閉以startActivity啟動的Activity
在調用finish()關閉當前Activity前,可以調用setResult(int resultCode)設置返回碼。返回碼在啟動的Activity中通過onActivityResult()捕獲

歡迎關注我的微信公眾號:安卓圈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM