2010-03-08 43 views
10

Có thể tạo IntentFilter trong Android khớp với TẤT CẢ mục đích được phát trên điện thoại (có thể bằng cách sử dụng BroadcastReceiver)? I E. những gì tôi thấy trong ddms khi tôi sử dụng điện thoại, dưới thẻ ActivityManager? Sau khi đào bới thông qua tài liệu, và nhìn vào nguồn khung, tôi còn lại để nghĩ rằng nó không thể được thực hiện? Bạn phải chỉ định một số loại dữ liệu, để diễn giải các tài liệu, "một số loại dữ liệu phải được chỉ định, nếu không bạn sẽ chỉ nhận được ý định không có dữ liệu". Ứng dụng tôi viết cần biết về mọi ứng dụng được khởi động trên hệ thống. Cho đến nay, cách duy nhất tôi có thể làm điều này là bằng cách bỏ phiếu ActivityManager. Dường như cách tốt nhất là có một giải pháp hướng sự kiện, sử dụng bất kỳ hoạt động logic nào mà ActivityManager sử dụng, nhưng tất cả đều là tiếng Hy Lạp bên trong nguồn khung ActivityManager.java, và có vẻ như rất nhiều thứ bên dưới (nếu không phải là ALL) được cố tình đóng gói từ tôi.Tạo IntentFilter trong android khớp với TẤT CẢ mục đích

Bất kỳ ý tưởng nào?

+0

+1 - Quan tâm để xem kết quả về điều này. –

Trả lời

7

Bạn đã tự mình nói, tài liệu hướng dẫn rõ ràng chỉ rõ cách bộ lọc mục đích hoạt động và không thể nhận tất cả các chương trình phát sóng.

Thông tin tác vụ này cũng như không truy lục là thông tin được hỗ trợ bởi các API được công khai trong SDK Android.

+0

buồn nhưng đúng, mặc dù nhìn trộm trong nguồn Android, có vẻ như một số nội dung này đã được công khai trong ảnh chụp GIT mới nhất –

+0

Ngay cả khi không thể kết hợp mọi thứ, câu trả lời này sẽ hữu ích hơn nếu nó mô tả cách xây dựng một bộ lọc phù hợp với nhiều ý định nhất có thể. – stewbasic

0

Bạn có thể đăng ký một máy thu trang phục cho từng loại sự kiện mà sẽ giữ một tham chiếu đến một máy thu phát sóng phụ huynh và gọi phương thức onReceive nó

class ChildBroadcastReceiver extends BroadcastReceiver { 

    private BroadcastReceiver parent; 

    public ChildBroadcastReceiver(BroadcastReceiver parent) { 
     this.parent = parent; 
    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     parent.onReceive(context, intent); 
    } 
} 

Sau đó, bạn có thể đăng ký cho tất cả các sự kiện có thể bằng cách sử dụng phản ánh:

final BroadcastReceiver parent = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      android.util.Log.d("GlobalBroadcastReceiver", "Recieved: " + intent.getAction() + " " + context.toString()); 
     } 
}; 

Intent intent = new Intent(); 
for(Field field : intent.getClass().getDeclaredFields()) { 
    int modifiers = field.getModifiers(); 
    if(Modifier.isPublic(modifiers) && 
     Modifier.isStatic(modifiers) && 
     Modifier.isFinal(modifiers) && 
     field.getType().equals(String.class)) { 

      String filter = (String)field.get(intent); 
      android.util.Log.d("GlobalBroadcastReceiver", "Registered: " + filter); 
      application.registerReceiver(new ChildBroadcastReceiver(parent), new IntentFilter(filter)); 
     } 
} 
Các vấn đề liên quan