2012-04-06 45 views
8

Tôi có 2 Hoạt động, mỗi Hoạt động trong các ứng dụng riêng biệt. Activity1 có một nút người dùng có thể nhấp chuột phải và nó gọi là hoạt động thứ hai sử dụng một ý định trong onClick() phương pháp của nó:Android onActivityResult được gọi là đầu tiên

Intent myIntent = getPackageManager().getLaunchIntentForPackage(com.myProject.Activity2); 
startActivityForResult(myIntent, 600); 

này sẽ khởi chạy một cách chính xác Activity2 từ Activity1, nhưng onActivityResult được gọi trong Activity1 trước onCreate được gọi trong Activity2, thay vì trong số onBackPressed() nơi tôi thiết lập mục đích trả lại.

Dưới đây là phương pháp onCreate cho Activity2:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

Dưới đây là phiên bản hiện tại của onBackPressed phương pháp Activity2:

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(); 
    intent.putExtra("Stuff", someStuff); 

    if(getParent()==null){ 
     setResult(Activity.RESULT_OK, intent); 
    }else{ 
     getParent().setResult(Activity.RESULT_OK, intent); 
    } 
    finish(); 
    super.onBackPressed(); 
} 

My AndroidManifest.xml có bộ lọc ý định sau đây cho Activity2:

<intent-filter> 
    <action android:name="android.intent.action.MAIN"/> 
    <category android:name="android.intent.category.LAUNCHER"/> 
</intent-filter> 

Tôi đã xác minh rằng số 012 của tôilà standard (và không phải singleTask, v.v.) như được thông báo here và mã yêu cầu của tôi không âm như được cảnh báo here. Tôi cũng đã thử android:launchMode="singleTop", nhưng đó cũng là một sự cố.

Tôi cũng đã cố gắng không gọi finish() trong onBackPressed() cho Activity2 như đã đề cập here (cũng chỉ với super.onBackPressed() như đề xuất here) và một lần nữa kêu gọi nó như đề xuất here.

Ngoài ra, tôi đã thử nhận xét dòng intent.putExtra("Stuff", someStuff); vì dường như gây ra sự cố cho this person.

Bất kỳ ý tưởng nào về những gì tôi có thể đang làm sai?

Trả lời

9

Vì vậy, đây là giải pháp cuối cùng mà đã chăm sóc nó:

Tôi đã thay đổi ý định cho Activity1 như sau:

Intent myIntent = new Intent(); 
myIntent.setClassName("com.myProject", "com.myProject.Activity2"); 
startActivityForResult(myIntent, 600); 

Đối với một số lý do Android đòi hỏi tên đầy đủ cho tham số thứ hai ngoài tên gói được đưa ra bởi tham số đầu tiên. Bây giờ nó hoạt động! :)

+1

Cảm ơn bạn rất nhiều vì đã quay lại và đăng giải pháp của bạn. Tôi đã bị mắc kẹt về vấn đề này trong một thời gian dài và tôi cũng đã thử tất cả các giải pháp mà bạn gặp phải trong câu hỏi của bạn không có kết quả. Điều này cố định nó và làm cho ngày của tôi một heck tốt hơn rất nhiều =) –

+0

Tôi sử dụng startActivityForResult WITHOUT setClassName hoặc tên đủ điều kiện trên tất cả các dự án của tôi và tất cả chúng hoạt động hoàn hảo ngoại trừ một trường hợp. Vì vậy, tôi đã thử giải pháp của bạn trong trường hợp đó và nó không tạo ra bất kỳ sự khác biệt nào. – user316117

+0

2h !! Cảm ơn bạn vì vậy mutch cho các giải pháp – Anthone

0

Không chắc chắn vấn đề của bạn là gì. Cách bạn đang tạo Intent trong Activity1 là lẻ; phương pháp đó không có nghĩa là tạo ra ý định khởi chạy một hoạt động khác trong cùng một ứng dụng. Một số nhà phát triển sử dụng hàm tạo Intent (Context, Class <>). Tôi thích sử dụng Intent (String action) với một chuỗi hành động tùy chỉnh được định nghĩa chỉ trong ứng dụng của tôi (dễ viết mã hơn).

Ngoài ra, bộ lọc ý định bạn đã chỉ định cho Activity2 thường được sử dụng cho hoạt động được khởi chạy trực tiếp từ Màn hình chính.

Mã onCreate() cho hoạt động2 ở đâu? Mã của onBackPressed() ở đâu? Bạn có thể chứng minh với tôi rằng setResult() được gọi trước một số mã khác trong Activity2? Bạn nên chạy các hoạt động trong gỡ lỗi. Đảm bảo rằng Activity2 đang nhận được ý định mà bạn nghĩ rằng nó nên, sau đó theo dõi từng bước các câu lệnh được thực hiện cho đến khi setResult(). Điều không phải cần làm là giải pháp ném vào mã trước khi bạn hiểu vấn đề cơ bản là gì.

Theo như tôi có thể nói cho đến nay, Activity1 đang gửi một Intent, và sau đó onActivityResult đang được gọi. Không có gì khác được chứng minh cho đến nay.

+0

Cảm ơn nhận xét - Tôi đã thêm phương thức 'onCreate' và' onBackPressed' vào câu hỏi. Tôi chạy nó debug nhiều lần và sử dụng các điểm break mà tôi có thể chỉ ra rằng Activity1 của 'onActivityResult' được gọi khi Activity2 được khởi chạy trước khi Activity2 trở lại, và không được gọi lại khi nó trả về. – user1205577

+0

Tôi cũng đã cố gắng tạo ra một ý định bằng cách sử dụng 'Intent (context, Activity2.class)', nhưng nó phàn nàn rằng nó không thể tìm thấy class (có thể vì nó nằm trong một ứng dụng khác). Tôi đã thử một vài biến thể của việc sử dụng tên đường dẫn đủ điều kiện và đó cũng là một con đường không đi. – user1205577

1

Điều này sẽ xảy ra nếu cờ "singleInstance" được đặt khi bạn khởi chạy hoạt động.

+0

Cảm ơn jbaylina câu trả lời của bạn rất hữu ích cho tôi – Swapnil

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