編輯:關於Android編程
通過intent傳遞數據時,使用以下代碼報錯:
hMapmap=(Map ) parent.getItemAtPosition(position); intent.putExtra("userInfoMap", map);
HashMapmap=(HashMap ) parent.getItemAtPosition(position); intent.putExtra("userInfoMap", map);
這是為啥呢,作為小白的我上網查找了一番,發現只有能序列化的數據才能放進去,intent傳遞數據的方法有以下幾個:
Intent putExtra(String name, String[] value) Intent putExtra(String name, Parcelable value) Intent putExtra(String name, long value) Intent putExtra(String name, boolean value) Intent putExtra(String name, double value) Intent putExtra(String name, Parcelable[] value) Intent putExtra(String name, char value) Intent putExtra(String name, int[] value) Intent putExtra(String name, int value) Intent putExtra(String name, double[] value) Intent putExtra(String name, short value) Intent putExtra(String name, long[] value) Intent putExtra(String name, boolean[] value) Intent putExtra(String name, short[] value) Intent putExtra(String name, String value) Intent putExtra(String name, Serializable value) Intent putExtra(String name, float[] value) Intent putExtra(String name, Bundle value) Intent putExtra(String name, byte[] value) Intent putExtra(String name, CharSequence value) Intent putExtra(String name, char[] value) Intent putExtra(String name, byte value) Intent putExtras(Intent src) Intent putExtras(Bundle extras)可以看到其可以傳遞的包括基本數據類型(含基本數據類型的數組)、String(包含數組)、Parcelable(包含數組)、Serializable、Bundle、CharSequence、Intent幾種類型的數據。對於Map類型(超類)的數據以及Long,Integer,Double,Byte,Float,Short,由於沒有 實現序列化接口,所以無法通過這種方法傳遞值
對於序列化數據的傳遞方式,可以采用如下方式傳遞
提交activity
lst.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView> parent, View view, int position, long id) { HashMap map=(HashMap) parent.getItemAtPosition(position); Intent intent=new Intent(); intent.setClass(btsAllinfoActivity.this,btsMapActivity.class); intent.putExtra("bts_map", map); startActivity(intent); } });
Intent intent=getIntent(); map=(HashMap)intent.getSerializableExtra("bts_map"); System.out.println("111111111111"); System.out.println(map.get("bt_id")); System.out.println(map.get("bt_name")); System.out.println(map.get("bt_lon")); System.out.println(map.get("bt_lat")); System.out.println("111111111111");對於Bundle類型的數據,可以采用如下方式:
提交activity
HashMap map=(HashMap) parent.getItemAtPosition(position); Intent intent=new Intent(); intent.setClass(btsAllinfoActivity.this,btsMapActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("bts_map", map); intent.putExtras(bundle); startActivity(intent);
Bundle bundle = getIntent().getExtras(); map=(HashMap)bundle.getSerializable("bts_map"); System.out.println("111111111111"); System.out.println(map.get("bt_id")); System.out.println(map.get("bt_name")); System.out.println(map.get("bt_lon")); System.out.println(map.get("bt_lat")); System.out.println("111111111111");
對於Android來說傳遞復雜類型,主要是將自己的類轉換為基礎的字節數組,Activity之間傳遞數據是通過Intent實現的。
Android序列化對象主要有兩種方法,實現Serializable接口、或者實現Parcelable接口。
實現Serializable接口是JavaSE本身就支持的,而Parcelable是Android特有的功能,效率比實現Serializable接口高,
而且還可以用在進程間通信(IPC)中。實現Serializable接口非常簡單,聲明一下就可以了。
而實現Parcelable接口稍微復雜一些,但效率更高,推薦用這種方法提高性能。
Parcelable接口的作用:實現了Parcelable接口的實例可以將自身的狀態信息(狀態信息通常指的是各成員變量的值)寫入Parcel,
也可以從Parcel中恢復其狀態。Parcel用來完成數據的序列化傳遞。
對於Parcel數據的傳遞方式,可以采用如下方式傳遞
通過實現Parcelable接口序列化對象的步驟: 1、實現Parcelable接口。 2、並且實現Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法 。 3、自定義類型中必須含有一個名稱為CREATOR的靜態成員,該成員對象要求實現Parcelable.Creator接口及其方法。實體類實現接口:
public class Person implements Parcelable { public static final Parcelable.CreatorCREATOR = new Creator () { @Override public Person[] newArray(int size) { return null; } @Override public Person createFromParcel(Parcel source) { Person result = new Person(); result.age = source.readInt(); result.name = source.readString(); result.address = source.readParcelable(Address.class.getClassLoader()); return result; } }; private Address address; private String name; private int age; @Override public int describeContents() { return 0; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(age); dest.writeString(name); dest.writeParcelable(address, PARCELABLE_WRITE_RETURN_VALUE); } 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; } @Override public String toString() { return "Person [address=" + address + ", name=" + name + ", age=" + age + "]"; } }
//官方的文檔裡說在不同進程之間使用Parce,在同進程內使用Bind, public void sendBroadCast(View viwe){ Log.d("test",Thread.currentThread().getName()+ "發送了一個消息給廣播"); Person person = new Person(); person.setAge(18); Address address = new Address(); address.setStreet("延陵南路"); person.setName("carlos"); person.setAddress(address); Intent intent = new Intent("aaaa"); intent.setClass(this, SendActivity.class); // intent.putParcelableArrayListExtra(name, value) intent.putExtra("person", person); startActivity(intent); }
參考:http://xiaomi4980.blog.163.com/blog/static/21594519620141236363445/
http://www.cnblogs.com/carlosk/archive/2012/09/28/2707521.html
這裡簡單介紹一下ZXing庫。ZXing是一個開放源碼的,用Java實現的多種格式的1D/2D條碼圖像處理庫,它包含了聯系到其他語言的端口。Zxing可以實現使用手機的內
在Java中默認情況下一個進程只有一個線程,也就是主線程,其他線程都是子線程,也叫工作線程。Android中的主線程主要處理和界面相關的事情,而子線程則往往用於執行耗時操
什麼是線程?線程或者線程執行本質上就是一串命令(也是程序代碼),然後我們把它發送給操作系統執行。一般來說,我們的CPU在任何時候一個核只能處理一個線程。多核處理器(目前大
(一)概述本節開始講解Android的四大組件之一的Activity(活動);官方文檔:Activity是一個應用程序的組件,他在屏幕上提供了一個區域,允許用戶在上面做一