将字符串信息从Fragment传递到BroadcastReceiver

时间:2018-07-18 21:01:34

标签: android android-fragments broadcastreceiver

我正在使用ACTION_UNINSTALL_PACKAGE来卸载软件包,并在删除后尝试检索已删除软件包的应用程序名称。我似乎只能得到包名称。由于软件包已经不存在,因此无法在软件包名称上使用ApplicationInfo。我尝试将值传递给意图,但是由于它进入了我UninstallerActivity所不拥有的另一项活动,因此它不存在。我无法弄清楚如何将字符串传递到IntentFilter数据字段中,因为我需要将其用作程序包名称。我没有使用sendBroadcast,所以无法使用。

@Override
        public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
            intent.setData(Uri.parse("package:"+packageName));
            intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");
            intentFilter.addDataScheme("package");

            mContext.registerReceiver(mUninstallReceiver, intentFilter);
            startActivity(intent);
}

private BroadcastReceiver mUninstallReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();

    if (action != null) {

        if (action.equals(Intent.ACTION_PACKAGE_REMOVED)) {
           Uri intentData = intent.getData();
           //the above only contains package name
        }
    }
 }
}

如何将应用程序名称传递给此广播接收器?

更新

我最终只使用了一个不是我完全想要的成员变量,但是它可以工作。

1 个答案:

答案 0 :(得分:0)

  

如何将应用程序名称传递给此广播接收器?

  • 定义您自己的自定义子类PackageManager,在其中向构造函数提供PackageManager
  • 让构造函数从BroadcastReceiver收集所需信息吗?
  • 在调用startActivity()
  • 之前创建一个BroadcastReceiver 的实例
  • 在某个地方onReceive()上保留该对象,以便在收到广播后立即取消注册
  • 如果用户有可能在第一次卸载完成之前请求卸载2个以上的应用程序,请BroadcastReceiver确认接收到的广播是针对它正在跟踪的程序包的,如采用此计划,您在任何时间点都会有2个以上未完成的Map个对象

还有其他可能的方法来组织此数据(例如,将包名{{1}}整理成数据,因此您只需要一个接收者),但是它们都遵循相同的思路:在收集数据之前,先收集所需的数据卸载,以便在接收广播时拥有数据。