2015-01-22 15 views
11

Tôi có bộ thu phát sóng trong ứng dụng được kích hoạt mỗi lần người dùng nhận cuộc gọi đến. Bây giờ, khi nó xảy ra, tôi cần bộ thu phát để gọi một phương thức cụ thể trong một hoạt động cụ thể. Bây giờ, tôi đã cố gắng để làm cho phương pháp này tĩnh và do đó có sẵn, nhưng một cái gì đó cho tôi biết đó là một ý tưởng rất xấu. Theo đó, tôi đã cố gắng khởi tạo bộ thu phát bên trong hoạt động của mình mà không khai báo nó trong tệp kê khai của tôi nhưng vấn đề là - khi ứng dụng tắt, hoạt động không tồn tại và do đó tôi không thể gọi phương thức của mình.Giao tiếp giữa BroadcastReceiver và Hoạt động - android

Vì vậy, câu hỏi của tôi là - Làm thế nào tôi có thể gọi phương thức này khi bộ thu phát được kích hoạt mà không làm cho nó "tĩnh công cộng"?

Đây là mã hoạt động của tôi (Tôi đã xóa những phần không liên quan)

package com.silverfix.ringo.activities; 

import com.silverfix.ringo.R; 
import com.silverfix.ringo.activities.fragments.DataManagerFragment; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.app.FragmentTransaction; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 

public class RingtonesActivity extends Activity{ 

    private DataManagerFragment dataManagerFragment; 
    private IntentFilter filter; 
    private BroadcastReceiver phoneCall; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_ringtones); 
     ActionBar ab = getActionBar(); 
     ab.setDisplayShowTitleEnabled(false); 
     ab.setDisplayHomeAsUpEnabled(true); 
     dataManagerFragment = new DataManagerFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.add(dataManagerFragment, "DataManagerFragment"); 
     ft.commit(); 
     filter = new IntentFilter(); 
     filter.addAction("android.intent.action.PHONE_STATE"); 
     phoneCall = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       dataManagerFragment.act(); 
      } 
     }; 
     registerReceiver(phoneCall, filter); 
    } 
} 
+0

khi u nhận được gọi Application của bạn là quay sang background.so gì u sẽ làm gì với hoạt động (khi ứng dụng ur là ở chế độ nền) ?? – KomalG

+0

phương thức đó có nhất thiết phải nằm trong lớp 'Activity' không? – mangusta

+0

Phương pháp đó sẽ làm gì? – Chandrakanth

Trả lời

4

này có thể giúp: how can I notify a running activity from a broadcast receiver?

Ngoài ra, bạn có thể thử sử dụng Observers

Cái gì như:

public class BroadcastObserver extends Observable { 
    private void triggerObservers() { 
     setChanged(); 
     notifyObservers(); 
    } 

    public void change() { 
     triggerObservers(); 
    } 
} 

Trong biên nhận quảng bá của bạn Iver:

@Override 
public void onReceive(Context context, Intent intent) { 
    BroadcastObserver bco = new BroadcastObserver(); 
    bco.change(); 
} 

và Hoạt động:

public class YourActivity extends Activity implements 
     Observer { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     BroadcastObserver bco = new BroadcastObserver(); 
     bco.addObserver(this); 
    } 

    @Override 
    public void update() { 
     //TODO: call your desired function 
    } 
} 
+0

chức năng cập nhật không được gọi là: ( –

33

Bạn có thể sử dụng các nhà quan sát, như

public class MyReceiver extends BroadcastReceiver { 
    public MyReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ObservableObject.getInstance().updateValue(intent); 
    } 
} 

public class MainActivity extends Activity implements Observer { 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ObservableObject.getInstance().addObserver(this); 
    } 

    @Override 
    public void update(Observable observable, Object data) {    
     Toast.makeText(this, String.valueOf("activity observer " + data), Toast.LENGTH_SHORT).show(); 
    } 
} 

public class ObservableObject extends Observable { 
    private static ObservableObject instance = new ObservableObject(); 

    public static ObservableObject getInstance() { 
     return instance; 
    } 

    private ObservableObject() { 
    } 

    public void updateValue(Object data) { 
     synchronized (this) { 
      setChanged(); 
      notifyObservers(data); 
     } 
    } 
} 

Có thể sử dụng bộ thu thông qua tệp kê khai. ObservableObject - phải là singleton.

+0

dude tuyệt vời. Công việc tốt. Nó hoạt động cho tôi – Amir

+0

Câu trả lời tuyệt vời! Tôi thích sử dụng các mẫu thiết kế) – Sermilion

+1

Lợi ích gì so với chỉ sử dụng biến tĩnh? Tôi có nghĩa là singleton là tĩnh anyway, phải không? – JohnyTex

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