android - scheme設定 - intent-filter作用




如何使用Intents將對像從一個Android活動發送到另一個? (20)

By far the easiest way IMHO to parcel objects. You just add an annotation tag above the object you wish to make parcelable.

An example from the library is below https://github.com/johncarl81/parceler

@Parcel
public class Example {
    String name;
    int age;

    public Example(){ /*Required empty bean constructor*/ }

    public Example(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getName() { return name; }

    public int getAge() { return age; }
}

我如何使用類IntentputExtra()方法將自定義類型的對像從一個Activity傳遞到另一個Activity


First implement Parcelable in your class. Then pass object like this.

SendActivity.java

ObjectA obj = new ObjectA();

// Set values etc.

Intent i = new Intent(this, MyActivity.class);
i.putExtra("com.package.ObjectA", obj);

startActivity(i);

ReceiveActivity.java

Bundle b = getIntent().getExtras();
ObjectA obj = b.getParcelable("com.package.ObjectA");

The package string isn't necessary, just the string needs to be the same in both Activities

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


If you have a singleton class (fx Service) acting as gateway to your model layer anyway, it can be solved by having a variable in that class with getters and setters for it.

In Activity 1:

Intent intent = new Intent(getApplicationContext(), Activity2.class);
service.setSavedOrder(order);
startActivity(intent);

In Activity 2:

private Service service;
private Order order;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quality);

    service = Service.getInstance();
    order = service.getSavedOrder();
    service.setSavedOrder(null) //If you don't want to save it for the entire session of the app.
}

In Service:

private static Service instance;

private Service()
{
    //Constructor content
}

public static Service getInstance()
{
    if(instance == null)
    {
        instance = new Service();
    }
    return instance;
}
private Order savedOrder;

public Order getSavedOrder()
{
    return savedOrder;
}

public void setSavedOrder(Order order)
{
    this.savedOrder = order;
}

This solution does not require any serialization or other "packaging" of the object in question. But it will only be beneficial if you are using this kind of architecture anyway.


POJO class "Post " (Note that it is implemented Serializable)

package com.example.booklib;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import android.graphics.Bitmap;

public class Post implements Serializable{
    public String message;
    public String bitmap;
    List<Comment> commentList = new ArrayList<Comment>();
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getBitmap() {
        return bitmap;
    }
    public void setBitmap(String bitmap) {
        this.bitmap = bitmap;
    }
    public List<Comment> getCommentList() {
        return commentList;
    }
    public void setCommentList(List<Comment> commentList) {
        this.commentList = commentList;
    }

}

POJO類“評論”(由於是Post類的成員,所以還需要實現Serializable)

    package com.example.booklib;

    import java.io.Serializable;

    public class Comment implements Serializable{
        public String message;
        public String fromName;
        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }
        public String getFromName() {
            return fromName;
        }
        public void setFromName(String fromName) {
            this.fromName = fromName;
        }

    }

然後在您的活動課中,您可以按照以下步驟將對像傳遞給其他活動。

ListView listview = (ListView) findViewById(R.id.post_list);
listview.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Post item = (Post)parent.getItemAtPosition(position);
            Intent intent = new Intent(MainActivity.this,CommentsActivity.class);
            intent.putExtra("post",item);
            startActivity(intent);

        }
    });

在您的收件人類“CommentsActivity”中,您可以獲取如下所示的數據

Post post =(Post)getIntent().getSerializableExtra("post");

The simplest would be to just use the following where the item is a string:

intent.putextra("selected_item",item)

For receiving:

String name = data.getStringExtra("selected_item");

你可以使用android BUNDLE來做到這一點。

從你的班級創建一個Bundle,如:

public Bundle toBundle() {
    Bundle b = new Bundle();
    b.putString("SomeKey", "SomeValue");

    return b;
}

然後通過這個捆綁INTENT。 現在你可以通過傳遞bundle來重新創建類對象

public CustomClass(Context _context, Bundle b) {
    context = _context;
    classMember = b.getString("SomeKey");
}

在你的Custom類中聲明並使用它。


使用谷歌的Gson庫,您可以將對像傳遞給另一個活動。實際上,我們將以json字符串的形式轉換對象,並在傳遞給其他活動後,我們將再次將對象重新轉換為這樣的對象

考慮一個像這樣的bean類

 public class Example {
    private int id;
    private String name;

    public Example(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我們需要傳遞Example類的對象

Example exampleObject=new Example(1,"hello");
String jsonString = new Gson().toJson(exampleObject);
Intent nextIntent=new Intent(this,NextActivity.class);
nextIntent.putExtra("example",jsonString );
startActivity(nextIntent);

For reading we need to do the reverse operation in NextActivity

 Example defObject=new Example(-1,null);
    //default value to return when example is not available
    String defValue= new Gson().toJson(defObject);
    String jsonString=getIntent().getExtras().getString("example",defValue);
    //passed example object
    Example exampleObject=new Gson().fromJson(jsonString,Example .class);

Add this dependancy in gradle

compile 'com.google.code.gson:gson:2.6.2'

創建Android應用程序

文件>>新建>> Android應用程序

輸入項目名稱:android-pass-object-to-activity

Pakcage:com.hmkcode.android

保持其他defult選擇,去下一個,直到你達到完成

在開始創建應用程序之前,我們需要創建POJO類“Person”,我們將使用它將對像從一個活動發送到另一個活動。 注意這個類正在實現Serializable接口。

Person.java

package com.hmkcode.android;
import java.io.Serializable;

public class Person implements Serializable{

    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

        // getters & setters....

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }   
}

兩個活動的佈局

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/tvName"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:text="Name" />

    <EditText
        android:id="@+id/etName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:ems="10" >
        <requestFocus />
    </EditText>
</LinearLayout>

<LinearLayout
     android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
<TextView
    android:id="@+id/tvAge"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
    android:text="Age" />
<EditText
    android:id="@+id/etAge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10" />
</LinearLayout>

<Button
    android:id="@+id/btnPassObject"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Pass Object to Another Activity" />

</LinearLayout>

activity_another.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
 >

<TextView
    android:id="@+id/tvPerson"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
 />

</LinearLayout>

兩個活動類

1)ActivityMain.java

package com.hmkcode.android;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

Button btnPassObject;
EditText etName, etAge;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnPassObject = (Button) findViewById(R.id.btnPassObject);
    etName = (EditText) findViewById(R.id.etName);
    etAge = (EditText) findViewById(R.id.etAge);

    btnPassObject.setOnClickListener(this);
}

@Override
public void onClick(View view) {

    // 1. create an intent pass class name or intnet action name 
    Intent intent = new Intent("com.hmkcode.android.ANOTHER_ACTIVITY");

    // 2. create person object
    Person person = new Person();
    person.setName(etName.getText().toString());
    person.setAge(Integer.parseInt(etAge.getText().toString()));

    // 3. put person in intent data
    intent.putExtra("person", person);

    // 4. start the activity
    startActivity(intent);
}

}

2)AnotherActivity.java

package com.hmkcode.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class AnotherActivity extends Activity {

TextView tvPerson;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);

    // 1. get passed intent 
    Intent intent = getIntent();

    // 2. get person object from intent
    Person person = (Person) intent.getSerializableExtra("person");

    // 3. get reference to person textView 
    tvPerson = (TextView) findViewById(R.id.tvPerson);

    // 4. display name & age on textView 
    tvPerson.setText(person.toString());

}
}

在你的課堂上實現可串行化

        public class Place implements Serializable{
        private int id;
        private String name;

        public void setId(int id) {
           this.id = id;
        }
        public int getId() {
           return id;
        }
        public String getName() {
           return name;
        }

        public void setName(String name) {
           this.name = name;
        }
        }

然後你可以意圖傳遞這個對象

     Intent intent = new Intent(this, SecondAct.class);
     intent.putExtra("PLACE", Place);
     startActivity();

在第二個活動中,您可以獲取像這樣的數據

     Place place= (Place) getIntent().getSerializableExtra("PLACE");

但是,當數據變大時,這種方法會很慢。


在你的類模型(Object)中實現Serializable,例如:

public class MensajesProveedor implements Serializable {

    private int idProveedor;


    public MensajesProveedor() {
    }

    public int getIdProveedor() {
        return idProveedor;
    }

    public void setIdProveedor(int idProveedor) {
        this.idProveedor = idProveedor;
    }


}

和你的第一個活動

MensajeProveedor mp = new MensajeProveedor();
Intent i = new Intent(getApplicationContext(), NewActivity.class);
                i.putExtra("mensajes",mp);
                startActivity(i);

和你的第二個活動(NewActivity)

        MensajesProveedor  mensajes = (MensajesProveedor)getIntent().getExtras().getSerializable("mensajes");

祝你好運!!


如果你只是傳遞物體, Parcelable就是為此而設計的。 與使用Java的本地序列化相比,它需要更多的努力來使用,但它的速度更快(我的意思是說, WAY更快)。

從文檔中,如何實現的一個簡單示例是:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

請注意,如果您從給定的包裹中檢索多個字段,則必須按照您放入的順序執行此操作(即採用FIFO方法)。

一旦你的對象實現了putExtra()putExtra()把它們放到你的Intents

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

然後你可以用getParcelableExtra()把它們拉出來:

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

如果你的對像類實現了Parcelable和Serializable,那麼確保你確實投射到下列其中之一:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);

如果你的對像類實現了Serializable ,你不需要做任何事情,你可以傳遞一個可序列化的對象。
這就是我使用的。


快速需要的簡短答案

1.實現你的類來實現Serializable。

如果你有任何內部類別不要忘記將它們實現為可序列化!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2.將你的對象放在意圖

 Intent intent = new Intent(SportsAct.this, SportSubAct.class);
            intent.putExtra("sport", clickedObj);
            startActivity(intent);

3.在另一個Activity類中接收你的對象

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");

您可以使用putExtra(Serializable ..)和getSerializableExtra()方法傳遞和檢索類類型的對象; 你將不得不標記你的類Serializable,並確保你的所有成員變量都是可序列化的...


您需要將您的對象序列化為某種字符串表示形式。 一種可能的字符串表示形式是JSON,如果您問我,可以通過Google GSON在Android中序列化JSON的最簡單方法之一

在這種情況下,你可以從(new Gson()).toJson(myObject); 並檢索字符串值並使用fromJson將其轉換回您的對象。

但是,如果你的對像不是很複雜,它可能不值得花費,你可以考慮傳遞對象的單獨值。


感謝提供幫助,但我找到了更多的可選解決方案

 public class getsetclass implements Serializable {
        private int dt = 10;
    //pass any object, drwabale 
        public int getDt() {
            return dt;
        }

        public void setDt(int dt) {
            this.dt = dt;
        }
    }

活動一

getsetclass d = new getsetclass ();
                d.setDt(50);
                LinkedHashMap<String, Object> obj = new LinkedHashMap<String, Object>();
                obj.put("hashmapkey", d);
            Intent inew = new Intent(SgParceLableSampelActivity.this,
                    ActivityNext.class);
            Bundle b = new Bundle();
            b.putSerializable("bundleobj", obj);
            inew.putExtras(b);
            startActivity(inew);

在活動中獲取數據2

 try {  setContentView(R.layout.main);
            Bundle bn = new Bundle();
            bn = getIntent().getExtras();
            HashMap<String, Object> getobj = new HashMap<String, Object>();
            getobj = (HashMap<String, Object>) bn.getSerializable("bundleobj");
            getsetclass  d = (getsetclass) getobj.get("hashmapkey");
        } catch (Exception e) {
            Log.e("Err", e.getMessage());
        }

我使用Gson以其強大而簡單的API來在活動之間發送對象,

// This is the object to be sent, can be any object
public class AndroidPacket {

    public String CustomerName;

   //constructor
   public AndroidPacket(String cName){
       CustomerName = cName;
   }   
   // other fields ....


    // You can add those functions as LiveTemplate !
    public String toJson() {
        Gson gson = new Gson();
        return gson.toJson(this);
    }

    public static AndroidPacket fromJson(String json) {
        Gson gson = new Gson();
        return gson.fromJson(json, AndroidPacket.class);
    }
}

2函數將它們添加到要發送的對象

用法

將對像從A發送到B

    // Convert the object to string using Gson
    AndroidPacket androidPacket = new AndroidPacket("Ahmad");
    String objAsJson = androidPacket.toJson();

    Intent intent = new Intent(A.this, B.class);
    intent.putExtra("my_obj", objAsJson);
    startActivity(intent);

在B接收

@Override
protected void onCreate(Bundle savedInstanceState) {        
    Bundle bundle = getIntent().getExtras();
    String objAsJson = bundle.getString("my_obj");
    AndroidPacket androidPacket = AndroidPacket.fromJson(objAsJson);

    // Here you can use your Object
    Log.d("Gson", androidPacket.CustomerName);
}

我幾乎在每個項目中都使用它,而且我沒有任何性能問題。


我找到的最簡單的解決方案是...用靜態數據成員與getter setter創建一個類。

從一個活動中設置並從另一個活動中獲取該對象。

活動A

mytestclass.staticfunctionSet("","",""..etc.);

活動b

mytestclass obj= mytestclass.staticfunctionGet();

有幾種方法可以訪問其他類或Activity中的變量或對象。

A.數據庫

B.共享偏好。

C.對象序列化。

D.一個能容納普通數據的類可以命名為Common Utilities,它取決於你。

E.通過Intents和Parcelable接口傳遞數據。

這取決於您的項目需求。

A. 數據庫

SQLite是嵌入到Android中的開源數據庫。 SQLite支持標準的關係數據庫功能,如SQL語法,事務和預處理語句。

教程 - http://www.vogella.com/articles/AndroidSQLite/article.html

B. 共享首選項

假設你想存儲用戶名。 所以現在有兩件事是關鍵用戶名, 值的價值。

如何存儲

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

使用putString(),putBoolean(),putInt(),putFloat(),putLong()可以保存所需的dtatype。

如何獲取

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. 對象序列化

如果我們想要保存一個對象狀態以通過網絡發送它,或者您也可以將它用於您的目的,則使用對象serlization。

使用java bean並將其作為他的一個領域存儲,並使用getter和setter來實現

JavaBeans是具有屬性的Java類。 將屬性視為私有實例變量。 由於他們是私人的,所以他們可以從課外訪問的唯一途徑是通過課堂中的方法。 更改屬性值的方法稱為setter方法,並且檢索屬性值的方法稱為getter方法。

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

通過使用在郵件方法中設置變量

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

然後使用對象Serialzation序列化這個對象,並在你的其他類中反序列化這個對象。

在序列化過程中,對象可以表示為包含對像數據的字節序列,以及有關對像類型和存儲在對像中的數據類型的信息。

序列化對象寫入文件後,可以從文件中讀取並反序列化,即可以使用表示對象及其數據的類型信息和字節在內存中重新創建對象。

如果你想要這個教程,請參考這個鏈接

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

在其他類中獲取變量

D.共同事業

你可以通過自己創建一個能夠包含你的項目中經常需要的常用數據的課程。

樣品

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. 通過意圖傳遞數據

請參閱本教程以獲取傳遞數據的選項。

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);
startACtivity(i);






android-activity