需求不讲了,目的是当app收到广播时,需要获取到发送者的包名(及pid、uid)。
关键字:onReceive、ComponetName、broadcasts、adb shell dumpsys activity broadcasts
一、普通方法不可行
一般来讲,通过如下方法,只是获取到当前的报名而非发送者包名,并非期望结果:
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "---onReceive: " + intent.getComponent() == null ? "null" : intent.getComponent().getPackageName());
}
二、相关知识
发送广播原理,不在重复介绍,可以参考现有文章:Broadcast机制源码详解-处理
从源码角度看,在发送广播初始阶段,会存储广播相关信息,这里就包括发送广播的应用报名,进程等。mMainThread.getApplicationThread()
,在后面逻辑,会通过进程号来获取到报名。activityThread里都有这些信息可查。
public void sendBroadcast(Intent intent) {
warnIfCallingFromSystemProcess();
//1. 返回 intent的 MIME data type
String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
try {
intent.prepareToLeaveProcess();
//2.直接调用ams的方法.
ActivityManagerNative.getDefault().broadcastIntent(
mM