2012-08-07 32 views
5

Tôi đã viết một lớp MyIntent mở rộng Intent. và sau đó tôi sử dụng một thể hiện của MyIntent để gọi startActivity (MyIntent).getIntent() và phân lớp của Intent

MyIntent i=new MyIntent(this,NewActivity.class); 

các nhà xây dựng là:

public MyIntent(Context context,Class<?> cls){ 
super(context,cls); 
putExtra(var1,var2); 
//other codes 
((Activity)context).startActivity(this); 
} 

Tuy nhiên, khi tôi gọi getIntent() trong hoạt động bắt đầu mới giá trị trả về của getIntent() là Intent không myIntent, đó là

getIntent() instanceof Intent // true; 
getIntent() instanceof MyIntent // false; 

khi tôi thử (MyIntent) getIntent() hệ thống sẽ ném cho tôi ClassCastException.How như vậy?

+0

Mục tiêu cuối cùng của bạn chính xác là gì? Bạn muốn một trang mới tải lên khi bạn nhấp vào một nút? hoặc .. – corecase

Trả lời

5

Bạn không thể làm điều đó, vì Intent triển khai giao diện ParcelableCloneable, nó được tạo lại khi đối tượng ý định di chuyển qua các quy trình. Do đó nó sẽ là một trường hợp khác.

Trong source code of ActivityManagerProxy, startActivity Bạn sẽ nhận thấy ý định đó sẽ không được chuyển qua tham chiếu, thay vào đó nó được viết thành Bưu kiện để tạo đối tượng mới. Vì vậy, đối tượng Intent đã tạo trong Activity trước đó sẽ không còn được gọi.

+1

Nếu không thể phân lớp Intent, thì LabeledIntent sẽ hoạt động như thế nào? http://developer.android.com/reference/android/content/pm/LabeledIntent.html – Krumelur

4

Bạn có thể sử dụng hàm tạo bản sao để chuyển đổi ý định "trừu tượng" thành ý tưởng cụ thể hơn. Do đó bạn sẽ cần ghi đè lên hàm tạo bản sao của lớp Intent và chỉ cần gọi siêu.

nói đây là ý định của bạn:

public class StronglyTypedIntent extends Intent { 
    private final static String ID = "verySecret";  

    public StronglyTypedIntent(final Activity initiator, final String someInformation) { 
     super(initiator, SomeTargetActivity.class); 
     putExtra(ID, someInformation); 
    } 

    public StronglyTypedIntent(final Intent original) { 
     super(original); 
    } 

    public String getSomeInformation() { 
     return getStringExtra(ID) 
    } 
} 

Sau đó, bạn có thể tiến hành ý định này từ "hoạt động khởi xướng" như thế này:

... 

public void someLogicInTheInitiatingActivity() { 
    startActivity(new StronglyTypedIntent(this, "some information")); 
} 
...  

Trong mục "hoạt động mục tiêu" bạn có thể có được Intent như thế này:

... 
public void someLogicInTheTargetActivity() { 
    StronglyTypedIntent intent = new StronglyTypedIntent(getIntent()); 

    doSomethingWithTheInformation(intent.getSomeInformation()); 
} 
... 

Về mặt kỹ thuật, đây có thể là cách hay để ngăn chặn ct các chi tiết về truyền dữ liệu thông qua các mục đích. Tuy nhiên, nó có thể là một vấn đề hiệu suất để luôn sao chép mục đích.

Các vấn đề liên quan