3

アクティビティの新しい更新がデバイスにインストールされたことを確認するサービスをセットアップしようとしています。私はすでにアプリケーションアクティビティ内でこれを行っておりBroadcastreceiver、マニフェストで を宣言しており、完全に機能しています。

ただし、そのレシーバーを Service 内で実行して動的に宣言しようとすると、onReceive決して呼び出されません。これは私のサービスコードです:

public class UpdateService extends Service {    
 private static String mPackage = "com.my.package";
 private static String mActivityName = "myActivity";
 private BroadcastReceiver mUpdateReceiver; 

 @Override
 public void onCreate() {
  super.onCreate();
  mUpdateReceiver = new BroadcastReceiver() {

   @Override
   public void onReceive(Context context, Intent intent) {
    Log.d("mTag","In the BroadcastReceiver onReceive()");
    if (intent.getAction().equalsIgnoreCase(Intent.ACTION_PACKAGE_REPLACED)) {
     // Log that a new update is has been found
     Log.d("mTag","New version of the app has been installed.");
     Log.d("mTag", "Intent data: " + intent.getDataString());
     Log.d("mTag","My package: " + mPackage);
    }
   }
  };

  Log.d("mTag","In the service onCreate() method.");
  IntentFilter filter = new IntentFilter();
  filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
  filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
  filter.addAction(Intent.ACTION_PACKAGE_ADDED);
  registerReceiver(mUpdateReceiver,filter);
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  Log.d("mTag","UpdateService started");            
  return Service.START_STICKY;
 }

 @Override
 public void onDestroy() {
  super.onDestroy();
  unregisterReceiver(mUpdateReceiver);
  Log.d("mTag","Service destroyed");
 }

 @Override
 public IBinder onBind(Intent arg0) {
  return null;
 }
}

サービスのログイン onCreate() が呼び出され、サービスが稼働中であることがわかります。ただし、adb を介していくつかのアプリをインストールして置き換えた後BroadcastReceiver、メソッドのログはonReceive()呼び出されません。

これは私の MainActivity です:

public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  startService(new Intent(this, UpdateService.class));
 }
}

onReceive()が呼び出されない理由はありますか?

ありがとうございました。

私はこれらの 2 つの参照に基づいてコードを作成しました。

4

2 に答える 2

5

IntentFilter にデータ スキーマを追加する必要があります。

 IntentFilter filter = new IntentFilter();
  filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
  filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
  filter.addAction(Intent.ACTION_PACKAGE_ADDED);

  filter.addDataScheme("package");

  registerReceiver(mUpdateReceiver,filter);
于 2013-06-08T01:37:19.817 に答える
2

放送を聴こうとしている場合ACTION_PACKAGE_REPLACED、これはサービスから行うことはできません。ほとんどの場合、アプリケーションが閉じられたときに置換が行われます。それがあなたがそれを聞かない理由です。

から登録して、Manifestこれをリッスンしたいことを OS に知らせてから、次のように BroadcastReceiver`Intentというクラスを作成します。extents

マニフェスト:

 <receiver android:name="PackageChangeReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <data android:scheme="package" />
        </intent-filter>
    </receiver>

レシーバー:

public class PackageChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED) && intent.getDataString().contains(context.getPackageName())) {
        Log.d("Tag", "Package has been replaced");
        Log.d("Tag", "Intent data: " + intent.getDataString());
        Log.d("Tag", "Action: " + intent.getAction());
    }
}
}

intent.getDataString().contains(context.getPackageName())パッケージの交換が他のアプリケーションではなく私のものであることを確認するかどうかを確認しました。

于 2014-02-09T13:23:19.473 に答える