2012-06-28 14 views
15

Tôi muốn tạo ứng dụng có thể phát sóng khi các ứng dụng khác trên thiết bị được cài đặt hoặc xóa.Cách làm cho ứng dụng của tôi nhận được phát sóng khi các ứng dụng khác được cài đặt hoặc xóa

mã của tôi

trong manifset:

<receiver android:name=".apps.AppListener"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_INSTALL"/> 
     <action android:name="android.intent.action.PACKAGE_ADDED"/> 
     <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
    </intent-filter> 
</receiver> 

trong AppListener:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class AppListener extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent arg1) { 
    // TODO Auto-generated method stub 
    Log.v(TAG, "there is a broadcast"); 
    } 
} 

nhưng tôi không thể nhận được bất kỳ phát sóng. Tôi nghĩ rằng vấn đề này là do quyền ứng dụng, bất kỳ ý tưởng?

Cảm ơn bạn đã trợ giúp.

Trả lời

40

Trong biểu hiện của bạn:

<receiver android:name=".apps.AppListener"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_INSTALL"/> 
     <action android:name="android.intent.action.PACKAGE_ADDED"/> 
     <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
    </intent-filter> 
</receiver> 

Thêm dòng trước thẻ ý định lọc

<data android:scheme="package"/> 

Vì vậy, biểu hiện của bạn sẽ trông như thế này:

<receiver android:name=".apps.AppListener"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_INSTALL"/> 
     <action android:name="android.intent.action.PACKAGE_ADDED"/> 
     <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
     <data android:scheme="package"/> 
    </intent-filter> 
</receiver> 

Am không chắc chắn về ý định PACKAGE_REMOVED trong đó nếu nó thực sự có sẵn.

+0

Nó làm việc 1 .. thnx –

+2

@ rup35h arg1.getDataString() sẽ trả lại "gói: TheInstalledPackageName" giống như "gói: com.google.joke " – wangqi060934

+0

' PACKAGE_INSTALL' là vô dụng, không được dùng nữa và chưa bao giờ được Google sử dụng: https://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_INSTALL – Solidak

17

Bạn phải loại bỏ android.intent.action.PACKAGE_INSTALL vì nó không còn được dùng nữa và không còn được đề xuất vì nó chỉ dành cho hệ thống. Mọi thứ khác là hoàn hảo và tôi khuyên bạn nên thay vì 100, đặt 999, tài liệu không cung cấp số lượng tối đa hoặc tối thiểu để sử dụng, số càng lớn thì ưu tiên cao hơn sẽ có người nhận của bạn cho mục đích đó. Xin lỗi cho người dịch. Tôi nói và viết bằng tiếng Tây Ban Nha. Information

<receiver android:name=".apps.AppListener"> 
<intent-filter android:priority="999"> 
    <action android:name="android.intent.action.PACKAGE_ADDED"/> 
    <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
    <data android:scheme="package"/> 
</intent-filter> 

+0

Thanx rất nhiều @kiddie .... –

7

Đáp Tuyệt vời, chỉ là một điều nhỏ trái:

Trên mỗi bản cập nhật ứng dụng đầu tiên ACTION_PACKAGE_REMOVED sẽ được gọi là tiếp theo ACTION_PACKAGE_ADDED- nếu bạn muốn bỏ qua những sự kiện này, chỉ cần thêm nó trên onReceive của bạn():

if(!(intent.getExtras() != null && 
    intent.getExtras().containsKey(Intent.EXTRA_REPLACING) && 
    intent.getExtras().getBoolean(Intent.EXTRA_REPLACING, false))) { 

    //DO YOUR THING 
} 

Đây là từ các tài liệu:

EXTRA_REPLACING thêm ở mức API 3 Chuỗi EXTRA_REPLACING Được sử dụng như một trường bổ sung boolean trong ý đồ ACTION_PACKAGE_REMOVED để cho biết rằng đây là một sự thay thế của gói, vì vậy phát sóng này sẽ ngay lập tức được theo sau bởi một add phát sóng cho một khác nhau phiên bản của cùng một gói. Giá trị không đổi: "android.intent.extra.REPLACING"

+0

Tôi muốn phát sóng của mình kích hoạt sự kiện chỉ khi ứng dụng được cài đặt hoặc gỡ cài đặt nhưng không bật khi ứng dụng được cập nhật. Làm thế nào để xử lý này? –