将系统广播发送到仅托管配置文件应用程序

问题描述:

我在用户配置文件以及托管配置文件(AFW)中都有一个应用程序。我试图根据包名发送广播。 intent.setPackage(packageName); mContext.sendBroadcastAsUser(intent,UserHandle.ALL);将系统广播发送到仅托管配置文件应用程序

结果是应用程序(用户和托管配置文件)都获得广播。

我想发送广播只管理配置文件的应用程序(所以基本上用户配置文件不应该收到)

+0

我想问你如果你能够执行mContext.sendBroadcastAsUser(intent,UserHandle.ALL);我读过它只能用于系统应用程序(是真的吗?) – Sam

+0

是的,我能够执行并且您是对的。 mContext.sendBroadcastAsUser(intent,UserHandle.ALL)只能从系统应用程序访问。我从PhoneWindowManager发送此广播。 –

它可以发送广播只管理配置文件如果能够获得管理配置文件的用户ID。

现在要获得用户ID,我们需要监听添加的托管配置文件的广播。

Intent.ACTION_MANAGED_PROFILE_ADDED 

步骤注册监听这个广播,

IntentFilter filter = new IntentFilter(); 
filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED); 
filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); 
context.registerReceiver(mManagedProfileListener, filter); 

现在里面的onReceive,如何获得用户ID,

@Override 
public void onReceive(Context context, Intent intent) { 
    if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(intent.getAction()) 
     && intent.hasExtra(Intent.EXTRA_USER)) { 
     UserHandle handle = intent.getExtras().getParcelable(Intent.EXTRA_USER); 
     userid = handle.getIdentifier(); 
    } 
} 

现在发送广播到用户ID(只有系统能发送这个广播),

mContext.sendBroadcastAsUser(intent, new UserHandle(userid)); 

注意:userid实际上是在设备上配置了托管配置文件或AFW(Android For Work)时在/ data/user下创建的文件夹名称。