小白带你学安卓——Intent
生活随笔
收集整理的這篇文章主要介紹了
小白带你学安卓——Intent
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)于Intent來(lái)說(shuō),我們之前也簡(jiǎn)單的接觸到一些。它的作用也十分的明顯,用于傳遞一些數(shù)據(jù);其實(shí),它還有另一個(gè)用途,描述你想要干的事情,是Android四大組件(Activity,Service,BroadcastReciver,ContentProvider)之間的紐帶。這兩個(gè)關(guān)鍵的作用,我就帶著大家一一進(jìn)行講解,方便大家的理解。
1.Activity之間傳遞數(shù)據(jù):
a.傳遞基本數(shù)據(jù)類(lèi)型/Stringb.傳遞Bundle(底層實(shí)現(xiàn)是Map)c.傳遞自定義對(duì)象(序列化)Serializable和Parcelable接口都可以實(shí)現(xiàn) 對(duì) 對(duì)象的序列化和反序列化Serializable接口是java提供的接口,它的序列化和反序列化是基于磁盤(pán)的,效率相對(duì)較低 (不可以跨進(jìn)程通訊 )Parcelable接口是Android提供的接口,它的序列化和反序列化是基于內(nèi)存的,效率要比Serializable要高。推薦使用。(跨進(jìn)程通訊)注意:Parcelable序列化的時(shí)候,write屬性的順序必須和read的順序一致簡(jiǎn)單的說(shuō),我們一般用到的在Activity之間傳遞數(shù)據(jù)無(wú)非就以上三種。接下來(lái)給大家看一下示例代碼,方便大家的理解。(這里不再給出XML文件的代碼,大家可以自行敲一下,因?yàn)橹皇且恍┖?jiǎn)單的布局,就沒(méi)有必要再浪費(fèi)大家的時(shí)間)(1)MainActivity.java
import java.io.Serializable; import java.util.ArrayList; import java.util.Map;import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener;public class MainActivity extends Activity implements OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//事件監(jiān)聽(tīng)findViewById(R.id.button1).setOnClickListener(this);findViewById(R.id.button2).setOnClickListener(this);findViewById(R.id.button3).setOnClickListener(this);findViewById(R.id.button4).setOnClickListener(this);findViewById(R.id.button5).setOnClickListener(this);findViewById(R.id.button6).setOnClickListener(this);}@Overridepublic void onClick(View v){Intent intent = new Intent(this, SecondActivity.class);switch (v.getId()){//基本數(shù)據(jù)類(lèi)型/Stringcase R.id.button1://數(shù)據(jù) /** 參一:類(lèi)似于Map中的key,到跳轉(zhuǎn)的界面后,通過(guò)此key將value取出來(lái)*/intent.putExtra("name", "張三");intent.putExtra("age", 20);break;//傳遞Bundlecase R.id.button2:/** Bundle:底層封裝的是Map,對(duì)HashMap進(jìn)一步封裝,使用起來(lái)更加方便*/Bundle extras = new Bundle();extras.putString("name", "李四");extras.putInt("age", 18);intent.putExtras(extras);//傳遞數(shù)組case R.id.button3:intent.putExtra("animals", new String[]{"Dog","Cat","Pig"});break;//傳遞自定義對(duì)象(Person)Serializablecase R.id.button4:intent.putExtra("person", new Person("小明", 12));break;//傳遞自定義對(duì)象(Student)Parcelablecase R.id.button5:/** Serializable和Parcelable接口都可以實(shí)現(xiàn) 對(duì) 對(duì)象的序列化和反序列化* Serializable接口是java提供的接口,它的序列化和反序列化是基于磁盤(pán)的,效率相對(duì)較低* Parcelable接口是Android提供的接口,它的序列化和反序列化是基于內(nèi)存的,效率要比Serializable要高。推薦使用。*/intent.putExtra("student", new Student("小亮", 15));break;case R.id.button6:ArrayList<Student> list = new ArrayList<Student>();list.add(new Student("小李", 20));list.add(new Student("小鄧", 22));intent.putParcelableArrayListExtra("list", list);break;}startActivity(intent);}}//實(shí)現(xiàn) Parcelable class Student implements Parcelable {private String name;private int age;public Student(String name, int age){super();this.name = name;this.age = age;}public int describeContents() {return 0;}//將數(shù)據(jù)寫(xiě)入Parcelpublic void writeToParcel(Parcel out, int flags) {out.writeString(name);out.writeInt(age);}public static final Parcelable.Creator<Student> CREATOR= new Parcelable.Creator<Student>() {public Student createFromParcel(Parcel in) {return new Student(in);}public Student[] newArray(int size) {return new Student[size];}};//從Parcel讀取數(shù)據(jù)private Student(Parcel in) {name = in.readString();age = in.readInt();}@Overridepublic String toString(){return this.name+" "+this.age;} }//Serializable:序列化接口 接口是在定義一種規(guī)范 class Person implements Serializable {private String name;private int age;public Person(String name, int age){super();this.name = name;this.age = age;}@Overridepublic String toString(){return this.name+" "+this.age;} }(2)SecondActivity.java
import java.util.ArrayList; import java.util.Arrays;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView;public class SecondActivity extends Activity {TextView mTvShow;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);mTvShow = (TextView) findViewById(R.id.tv_show);//取上個(gè)界面?zhèn)鬟^(guò)來(lái)的數(shù)據(jù)//哪個(gè)Intent啟動(dòng)的此Activity,這個(gè)方法返回的就是這個(gè)IntentIntent intent=getIntent();/** 傳遞基本數(shù)據(jù)類(lèi)型 String name = intent.getStringExtra("name");int age = intent.getIntExtra("age", 0);mTvShow.setText("name:"+name+" age:"+age);*//* * 傳遞Bundle數(shù)據(jù)* Bundle bdl = intent.getExtras();String name = bdl.getString("name");int age = bdl.getInt("age");mTvShow.setText("name:"+name+" age:"+age);*//* * 傳遞數(shù)組數(shù)據(jù)* String[] animals = intent.getStringArrayExtra("animals");mTvShow.setText("animals:"+Arrays.toString(animals));*//** 傳遞對(duì)象數(shù)據(jù) Serializable* Person person=(Person) intent.getSerializableExtra("person");mTvShow.setText("person:"+person.toString());*//* * 傳遞對(duì)象數(shù)據(jù) Parcelable* Student student=intent.getParcelableExtra("student");mTvShow.setText("person:"+student.toString());*///Parcelable類(lèi)型的集合數(shù)據(jù)ArrayList<Student> list = intent.getParcelableArrayListExtra("list");mTvShow.setText("list:"+list.toString());}} 上面很多都是我自己打了注釋的,大家在參考代碼的時(shí)候,可以把注釋放開(kāi)。以上呢,就是我理解的傳遞數(shù)據(jù)的一些知識(shí)點(diǎn)的整理。2.Intent隱式意圖:
對(duì)于顯式意圖來(lái)說(shuō),大家理解起來(lái)肯定很容易,我貼一小段代碼,大家看后就理解了: a.顯示意圖:用于啟當(dāng)前應(yīng)用中的其它組件Intent intent = new Intent(this, Other1Activity.class);startActivity(intent);b.隱式意圖:意圖過(guò)濾器---可以用于同一個(gè)應(yīng)用或者不同應(yīng)用之間。可能這個(gè)概念大家不是很了解,那我現(xiàn)在帶著大家慢慢的去看一下隱式意圖到底是什么東東,其實(shí)在剛剛開(kāi)始的時(shí)候,我對(duì)其理解也不是很透徹,但是看了一下網(wǎng)上的代碼和書(shū),也是逐漸明白了其原理。接下來(lái),我用我的大白話(huà)給大家講述一下:如果你有一個(gè)組件希望別的應(yīng)用程序可以調(diào)用,你就應(yīng)該給你這個(gè)組件配置一個(gè)intent-filter<intent-filter><action android:name="com.tz.go1"/><category android:name="android.intent.category.DEFAULT"/></intent-filter>intent-filter:包含兩部分 1,目的【action】---->你要到哪里去2,內(nèi)容【category+data】----》去的路上要帶什么 區(qū)分性的數(shù)據(jù)和內(nèi)容性的數(shù)據(jù)可以認(rèn)為就在Action的基礎(chǔ)上增加了過(guò)濾條件I.action+category默認(rèn)category (android.intent.category.DEFAULT)必須配置,你也可以添加自己的。II.action+category+data(增加了一個(gè)過(guò)濾條件)<dataandroid:scheme="sun"android:host="www.sun.com"android:path="/mypath"/>URI:統(tǒng)一資源標(biāo)識(shí) 組成跟URL基本一樣Uri:sun://www.sun.com/shuyiURL:網(wǎng)址,統(tǒng)一資源定位符http://www.baidu.com/index.htmlhttp:// ----scheme 協(xié)議www.baidu.com ---host 主機(jī)地址index.html ----path 路徑III.action+category+data+mimeType(增加了一個(gè)過(guò)濾條件)<data android:scheme="myscheme" android:mimeType="image/*"/>但是這里有一個(gè)問(wèn)題要大家注意一下:當(dāng)data和mimeType同時(shí)存在時(shí),不要單獨(dú)通過(guò)setData或setType方法進(jìn)行設(shè)置,需要使用setDataAndType進(jìn)行設(shè)置。至于這里的代碼,我寫(xiě)的不是很全,大家可以去網(wǎng)上搜一搜,代碼還是很多的~不好意思啦!總結(jié)
以上是生活随笔為你收集整理的小白带你学安卓——Intent的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: javascript招式总结
- 下一篇: Stata:一文读懂事件研究法Event