2011-10-04 46 views
7

Tôi đang cố gắng tạo một dự án android có chứa mã được chia sẻ sẽ được người khác sử dụng. Trong dự án này, tôi chỉ có POJO và không có lớp học cụ thể cho android.onActivityResult bên ngoài phạm vi hoạt động

Một số chức năng yêu cầu gọi một số hoạt động và phụ thuộc vào kết quả. Các lớp POJO của tôi được tham chiếu đến hoạt động gọi điện khi được sử dụng, nhưng điều đó xảy ra vào thời gian chạy và tôi không có quyền kiểm soát việc triển khai các hoạt động đó.

Vấn đề của tôi là với các tài liệu tham khảo của các hoạt động gọi điện thoại tôi có thể startActivityForResult nhưng tôi không có cách nào thêm onActivityResult, mà có thể tồn tại trong hoạt động gọi điện thoại nhưng không nhận thức được requestCode tôi đã sử dụng.

Câu hỏi của tôi sau đó là làm cách nào để biết, từ bên trong một đối tượng java thông thường khi hoạt động trở lại? vì tôi hiểu rằng tôi chỉ có thể triển khai onActivityResult trên các lớp Hoạt động.

cảm ơn!

Trả lời

0

Câu hỏi của tôi sau đó là làm cách nào để biết, từ trong một đối tượng java thông thường khi hoạt động trở lại?

Cho phép hoạt động gọi POJO, cung cấp kết quả.

lớp POJO tôi có được tham chiếu đến các hoạt động gọi điện thoại khi được sử dụng, nhưng điều đó đang xảy ra tại thời gian chạy và tôi không có quyền kiểm soát việc thực hiện các hoạt động.

Sau đó, bất kỳ ai trong "kiểm soát việc triển khai các hoạt động đó" sẽ cần phải có hoạt động gọi POJO, cung cấp kết quả. Điều này không khác với bất kỳ cơ chế gọi lại/nghe khác nào.

+0

Vâng, tôi có một số hạn chế khó chịu tôi cần phải đối phó với .. những gì bao giờ sử dụng POJO của tôi giống như một hộp đen đối với tôi , tất cả tôi biết rằng nó gọi các phương thức trên POJO của tôi và ngược lại mong đợi một kết quả. Đối với các hoạt động tôi muốn gọi từ bên trong POJO, đó là những hoạt động hiện có trong thiết bị Android, cũng nằm ngoài tầm kiểm soát của tôi .. Tôi chỉ cần gọi cho họ (hãy liên hệ với họ) và nhận kết quả . cảm ơn. –

+0

@Nitzan Tomer: "Tôi có một số khó khăn khó khăn mà tôi cần phải giải quyết" - những ràng buộc đó sẽ cần phải được dỡ bỏ. Bạn không thể sử dụng 'startActivityForResult()' ngoại trừ một số hoạt động của bạn, nơi bạn thực hiện 'onActivityResult()'. – CommonsWare

1

Bạn sẽ có khá một vài vấn đề với thiết lập này, nhưng đây là cách bạn có thể muốn bắt đầu:

Bạn sẽ phải bao gồm một hoạt động trong dự án của bạn mà không làm gì khác hơn là bắt đầu hoạt động bạn muốn để có được kết quả từ và lưu trữ nó trong một lưu trữ truy cập toàn cầu (ví dụ như một singleton hoặc một trường tĩnh).

class Pojo { 
    static final ConditionVariable gate = new ConditionVariable(); 
    static int result; 

    int m(Context context) { 
     context.startActivity(new Intent(context, ForwarderActivity.class)); 
     gate.block(); 
     return result; 
    } 
} 

class ForwarderActivity extends Activity { 
    private boolean started = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (!started) { 
      started = true; 
      startActivityForResult(new Intent("ContactsProvider"), 1); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Pojo.result = resultCode; 
     Pojo.gate.open(); 
    } 
} 

Có một số vấn đề. Giống như phương thức POJO của bạn không thể được gọi từ luồng chính (UI), bởi vì bạn cần chuyển đổi một cuộc gọi không đồng bộ (startActivityForResult()) thành một hàm đồng bộ (Pojo.m()) và hoạt động bạn muốn nhận thông tin từ sẽ được bắt đầu trên chuỗi chính, vì vậy bạn không thể chặn nó trong Pojo.m() ...

Dù sao, mã không hoạt động, nhưng bạn có thể xem đường đi nào nếu bạn thực sự phải dán với thiết lập này. Nhưng bạn thực sự nên cố gắng tìm ra một số phương tiện khác để tìm nạp dữ liệu, như một nhà cung cấp nội dung.

0

Có thể PendingIntent http://developer.android.com/reference/android/app/PendingIntent.html có thể giúp bạn với điều đó. Tôi vẫn đang tìm kiếm giải pháp cho vấn đề của tôi và đối với tôi, lớp học này trông khá hứa hẹn.

Một cách khác có thể là làm cho lớp của bạn trừu tượng và có phương thức onActivityResult bắt buộc phải ghi đè.Tất nhiên, bạn sẽ phải dựa vào JavaDoc và "hãy gọi super.onActivityResult" để có thể xử lý kết quả trong mã của bạn. Nhưng nếu người dùng của lớp của bạn muốn có một số thành công với mã của bạn, họ nên làm theo hướng dẫn JavaDoc của bạn.

1

tôi có cùng một vấn đề trong khi tôi chơi với UNITY3D, sự thống nhất có Hoạt động riêng của nó (trình phát thống nhất), tôi không muốn chỉnh sửa nó vì một lý do nào đó. nhưng hoạt động của người chơi không làm gì bên trong hàm "onActivityResult". Và tôi có một số việc cần làm khi truy cập bộ chọn hình ảnh, tôi có thể gọi "unityPlayer.startActivityForResult" để mở bộ chọn hình ảnh, nhưng KHÔNG CÓ CÁCH MÃ "ONActivityResult" của riêng tôi.

tôi nghĩ rằng những gì chúng tôi hy vọng là một cái gì đó như thế này:

OtherActivityClass.onActivityResultListener=function(){My Own CODE}..........OR OtherActivityClass.onActivityResultListener.add(myResultListener)..................

+0

Vui lòng sử dụng các khối mã để định dạng mã của bạn tốt hơn – gareththegeek

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