2012-11-28 41 views
7

Vì vậy, tôi có một Câu hỏi đơn giản, có thể Xử lý Phương thức onActivityResult() trong Dịch vụ nếu Hoạt động này được Bắt đầu từ Dịch vụ Tương tự (Sử dụng Ý định)?Xử lý onActivityResult trên Dịch vụ

Trong trường hợp của tôi, tôi muốn bắt đầu SpeechRegnition, Nói chuyện, và có được kết quả trên Dịch Vụ, Tất cả mọi thứ trên nền (Main Service Bắt đầu từ một Widget),

Cảm ơn.

+0

tôi đã không cố gắng và tôi chưa bao giờ cố gắng sử dụng onAtcivityResult trong một lớp không hoạt động ngay bây giờ ... – user1839514

Trả lời

6

Cảm ơn bạn đã giảm giá gần đây, dù đó là ai. Câu trả lời trước tôi đã trả lại vào năm 2012 là tổng số không thành công nên tôi quyết định viết một câu trả lời thích hợp.

Bạn không thể xử lý kết quả Hoạt động trong một Dịch vụ, nhưng bạn có thể chuyển bất kỳ dữ liệu nào được truy xuất từ ​​onActivityResult() đến một Dịch vụ.

Nếu dịch vụ của bạn đang chạy, bạn có thể gọi startService() với một xử lý sự kiện tiếp cận mục đích mới, như vậy

@Override 
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == CODE && resultCode == RESULT_OK) { 
     notifyService(data); 
    } 
} 

private void notifyService(final Intent data) { 
    final Intent intent = new Intent(this, MyService.class); 
    intent.setAction(MyService.ACTION_HANDLE_DATA); 
    intent.putExtra(MyService.EXTRA_DATA, data); 
    startService(intent); 
} 

Và xử lý hành động trong một dịch vụ. Nếu nó vẫn đang chạy nó sẽ không được khởi động lại, nếu không nó sẽ được bắt đầu

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     final String action = intent.getAction(); 
     if (action != null) { 
      switch (action) { 
       case ACTION_HANDLE_DATA: 
        handleData(intent.getParcelableExtra(EXTRA_DATA)); 
        // Implement your handleData method. Remember not to confuse Intents, or even better make your own Parcelable 
        break; 
      } 
     } 
    } 
    return START_NOT_STICKY; 
} 
+0

Bạn không cần phải hiển thị nó. Nó chỉ phải được khởi tạo một lần. Ứng dụng của bạn được bắt đầu bởi một số hoạt động. Ghi đè phương thức gọi lại ra khỏi đó. Tạo tham chiếu tĩnh của nó để truy cập từ một Dịch vụ, sau đó bắt đầu hoạt động mong muốn từ tham chiếu đó trong dịch vụ và bạn sẽ nhận được kết quả trong hoạt động được tham chiếu. Sau những gì bạn có thể gọi một phương pháp tĩnh trên dịch vụ hoặc gửi một phát sóng hoặc bất cứ điều gì để cung cấp kết quả cho dịch vụ. Nhưng tôi không nhớ nếu bạn sẽ được gửi lại đến một hoạt động sau khi Hoạt động diễn thuyết kết thúc hay không. –

+0

Đã cập nhật câu trả lời. –

+1

đó là một thực tế rất xấu. Lưu trữ một hoạt động trong một trường tĩnh làm cho hoạt động bị rò rỉ trừ khi bạn đặt nó thành rỗng. Thậm chí nếu bạn cẩn thận thì vẫn còn xấu xí để làm. Có nhiều cách để xử lý này – dnkoutso

1

Không có điều nào như OnActivityForResult bên trong phạm vi Service.

Bạn có thể đọc hướng dẫn dành cho nhà phát triển Android here.

+1

ok thats lý do tại sao tôi hỏi làm thế nào tôi có thể làm điều đó, thx. – user1839514

0

thời gian gần đây tôi stumbled khi cùng một vấn đề, làm thế nào để dây onActivityResult() kết quả đến một dịch vụ cho một Hoạt động bắt đầu từ các dịch vụ nói trên. Tôi không muốn lưu trữ các hoạt động trong một biến tĩnh cho rằng rò rỉ hoạt động là một thực tế xấu. Vì vậy, tôi đã thêm một trình lắng nghe tĩnh trong xử lý Hoạt động onActivityResult(), thực hiện một Giao diện thích hợp và khởi tạo trình nghe này là một thành viên riêng tư của lớp Service.

Mã trong một hình thức đơn giản như sau:

public class MyActivity extends FragmentActivity { 

    public Interface ResultListener { 
     onPositiveResult(); 
     onNegativeResult(); 
    } 

    private static ResultListener mResultListener; 

    public static setListener(ResultListener resultListener) { 
     mResultListener = resultListener; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == Activity.RESULT_OK && mResultListener != null) { 
      mResultListener.onPositiveResult(); 
     } else if (resultCode == Activity.RESULT_CANCELED && mResultListener != null) { 
      mResultListener.onNegativeResult(); 
     } 
     mResultListener = null; 
    } 
} 

public class MyService { 

    private MyActivity.ResultListener mListener = new MyActivity.ResultListener() { 
     onPositiveResult() { 
      // do something on RESULT_OK 
     } 
     onNegativeResult() { 
      // do something on RESULT_CANCELED 
     } 
    } 

    private void startActivityForResultFromHere() { 
     MyActivity.setListener(mListener); 
     Intent intent = new Intent(); 
     intent.setClass(this, MyActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 
} 

Như bạn có thể thấy tôi không thể tránh tham khảo tĩnh do các vấn đề luân chuyển thiết bị, nhưng tôi nghĩ rằng giải pháp này là thích hợp hơn; mặc dù dài dòng.

0

Mở hoạt động trong suốt từ dịch vụ và sử dụng BroadcastReceiver trong dịch vụ. Thực hiện theo các bước chi tiết.

1. mở hoạt động suốt từ Dịch vụ

Intent i = new Intent(mContext, FloatingServiceSupportActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
i.putExtra("action", "SpeechRegnition"); 
mContext.startActivity(i); 

// Để sử dụng hoạt động minh bạch mã này trong AndroidManifest.xml

<activity 
android:name=".FloatingServiceSupportActivity" 
android:theme="@style/Theme.Transparent" /> 

2. Tạo BroadcastReceiver trong Dịch vụ

BroadcastReceiver brOnActivityResult = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO: 
    } 
}; 

3. Đăng ký chương trình phát sóng này trên onCreate of Service

IntentFilter brintent = new IntentFilter(); 
brintent.addAction("brActionFloatingServiceOnActivityResult"); 
mContext.registerReceiver(brOnActivityResult, brintent); 

4. Unregister phát sóng này trong onDestroy of Service

mContext.unregisterReceiver(brOnActivityResult); 

5. Làm công việc trong hoạt động bằng cách sử dụng startActivityForResult và Gửi phát sóng từ Hoạt động của (FloatingServiceSupportActivity) onActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
super.onActivityResult(requestCode, resultCode, data); 

Intent i = new Intent(); 
i.setAction("brActionFloatingServiceOnActivityResult"); 
i.putExtra("action", "initTextToSpeech"); 
mActivity.sendBroadcast(i); 

mActivity.finish(); 
} 
Các vấn đề liên quan