1. 目的
appwidget 主要根据广播进行传递,如果拦截了会影响小部件的数据更新,一般通过下面的action传递事件,即不能进行拦截
android.appwidget.action.APPWIDGET_ENABLED
android.appwidget.action.APPWIDGET_UPDATE
android.appwidget.action.APPWIDGET_DELETED
2. 拦截桌面小部件
if (intent != null
&& "android".equals(callerApp)) {
String action = intent.getAction();
if (action != null && action.startsWith("android.appwidget.action.")) //AppWidget action
return true;
}
3. 应用层识别
3.1 获取所有的桌面小部件
public static HashMap<String, ArrayList<String>> getAppWidgetList(Context mContext) {
HashMap<String, ArrayList<String>> result = new HashMap<String, ArrayList<String>>();
AppWidgetManager mAppWidgetManager = AppWidgetManager.getInstance(mContext);
List<AppWidgetProviderInfo> providers = mAppWidgetManager.getInstalledProviders();
if (providers != null && !providers.isEmpty()) {
for (AppWidgetProviderInfo info : providers) {
ComponentName cpName = info.provider;
String packageName = cpName.getPackageName();
String className = cpName.getClassName();
if (result != null && result.containsKey(packageName)) {
result.get(packageName).add(className);
Log.d(TAG, "getAppWidgetList append packageName = " + packageName + ", className = " + className);
} else {
ArrayList<String> classNameList = new ArrayList<>();
classNameList.add(className);
result.put(packageName, classNameList);
Log.d(TAG, "getAppWidgetList add packageName = " + packageName + ", className = " + className);
}
}
}
return result;
}
3.2 获取luncher数据库中的桌面小部件
/**
* @param context
* @return <uses-permission
* android:name="com.android.launcher3.permission.READ_SETTINGS"/>
*/
public static Map<String, String> getLauncher3WidgetInfo(Context context) {
final Uri widgetUri = Uri.parse("content://" + "com.android.launcher3.settings" + "/" + "favorites");
Cursor cursor = null;
Map<String, String> widgetList = new HashMap<String, String>();
try {
cursor = context.getContentResolver().query(widgetUri, new String[]{"itemType", "appWidgetProvider"}, "itemType" + "=?", new String[]{"4"}, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String appWidgetProvider = cursor.getString(cursor.getColumnIndex("appWidgetProvider"));
String packageName = appWidgetProvider.split("/")[0];
if (widgetList != null && widgetList.containsKey(packageName)) {
// do nothing
} else {
widgetList.put(packageName, packageName);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
cursor = null;
}
}
return widgetList;
}