XPOSED源码研究之XposedInstaller(5)ModulesFragment
来源:互联网 发布:网络舆情重要性 编辑:程序博客网 时间:2024/05/18 03:29
由于安装的模块是一个列表,ModulesFragment继承自ListFragment方便管理,ListFragment的使用可以参考:ListFragment 使用ListView and 自定义Adapter。
当有安装的模块被加载时,接受通知并做处理:
@Override public void onSingleInstalledModuleReloaded(ModuleUtil moduleUtil, String packageName, InstalledModule module) { getActivity().runOnUiThread(reloadModules); } @Override public void onInstalledModulesReloaded(ModuleUtil moduleUtil) { getActivity().runOnUiThread(reloadModules); }
private Runnable reloadModules = new Runnable() { public void run() { mAdapter.setNotifyOnChange(false); mAdapter.clear(); mAdapter.addAll(mModuleUtil.getModules().values()); final Collator col =Collator.getInstance(Locale.getDefault()); mAdapter.sort(newComparator<InstalledModule>() { @Override public int compare(InstalledModule lhs, InstalledModule rhs) { return col.compare(lhs.getAppName(), rhs.getAppName()); } }); mAdapter.notifyDataSetChanged(); } };
@Override public boolean onContextItemSelected(MenuItem item) { InstalledModule module = getItemFromContextMenuInfo(item.getMenuInfo()); if (module == null) returnfalse; switch (item.getItemId()) { case R.id.menu_launch: startActivity(getSettingsIntent(module.packageName)); return true; caseR.id.menu_download_updates: Intent detailsIntent = new Intent(getActivity(), DownloadDetailsActivity.class); detailsIntent.setData(Uri.fromParts("package", module.packageName, null)); startActivity(detailsIntent); return true; caseR.id.menu_support: NavUtil.startURL(getActivity(), RepoDb.getModuleSupport(module.packageName)); return true; case R.id.menu_play_store: Intent i = new Intent(android.content.Intent.ACTION_VIEW); i.setData(Uri.parse(String.format(PLAY_STORE_LINK, module.packageName))); i.setPackage(PLAY_STORE_PACKAGE); try { startActivity(i); } catch(ActivityNotFoundException e) { i.setPackage(null); startActivity(i); } return true;case R.id.menu_app_info: startActivity(newIntent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", module.packageName, null))); return true; caseR.id.menu_uninstall: startActivity(new Intent(Intent.ACTION_UNINSTALL_PACKAGE, Uri.fromParts("package", module.packageName, null))); return true; } return false; }
其中运行app功能,getSettingsIntent用以获取指定包名的启动Intent:
private Intent getSettingsIntent(String packageName) { // taken from ApplicationPackageManager.getLaunchIntentForPackage(String) // first looks for an Xposed-specific category, falls back to getLaunchIntentForPackage PackageManager pm =getActivity().getPackageManager(); Intent intentToResolve = newIntent(Intent.ACTION_MAIN); intentToResolve.addCategory(SETTINGS_CATEGORY); intentToResolve.setPackage(packageName); List<ResolveInfo> ris = pm.queryIntentActivities(intentToResolve, 0); if (ris == null || ris.size() <= 0) {return pm.getLaunchIntentForPackage(packageName); } Intent intent = newIntent(intentToResolve); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClassName(ris.get(0).activityInfo.packageName, ris.get(0).activityInfo.name); return intent; }
获取支持:通过包名查询出url然后打开访问:
public static void startURL(Context context, Uri uri) { Intent intent = newIntent(Intent.ACTION_VIEW, uri); intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); if ("http".equals(uri.getScheme()) && "repo.xposed.info".equals(uri.getHost())) { Intent browser = newIntent(Intent.ACTION_VIEW, EXAMPLE_URI); ComponentName browserApp =browser.resolveActivity(context.getPackageManager()); intent.setComponent(browserApp); } context.startActivity(intent); } public staticvoid startURL(Context context, String url) { startURL(context, parseURL(url)); }
访问appstore的方式直接访问https://play.google.com/store/apps/details?id=包名
程序信息直接通过打开系统设置来显示:
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", module.packageName, null)));
卸载程序也是直接调用系统的卸载:
startActivity(new Intent(Intent.ACTION_UNINSTALL_PACKAGE,
Uri.fromParts("package", module.packageName, null)));
0 0
- XPOSED源码研究之XposedInstaller(5)ModulesFragment
- XPOSED源码研究之XposedInstaller(3)XposedInstallerActivity
- XPOSED源码研究之XposedInstaller(4)InstallerFragment
- XPOSED源码研究之XposedInstaller(6)DownloadFragment
- XPOSED源码研究之XposedInstaller(7)SettingsFragment
- XPOSED源码研究之XposedInstaller(1)从manifest开始XposedApp
- XPOSED源码研究之XposedInstaller(2)从manifest开始WelcomeActivity
- XPOSED源码研究之简单介绍
- Xposed源码分析
- Xposed源码阅读小结
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——Xposed初始化
- Xposed框架原理深入研究
- Xposed框架原理深入研究
- LIVE555源码研究之MediaServer(转)
- LIVE555源码研究之RTPServer(转)
- 研究Xposed相关一:Xposed框架的安装
- Python网络编程(Socket)
- [Elasticsearch] 聚合作用域(Scoping Aggregations) 4
- android BaseAdapter getView 理解
- HDU 1555 How many days?
- android Expandlistview实例实现
- XPOSED源码研究之XposedInstaller(5)ModulesFragment
- Linux导入导出Oracle数据库
- [002] 微信公众帐号开发教程第2篇-微信公众帐号的类型(普通和会议)
- 在熟练使用2B铅笔前,请不要打开Axure
- XPOSED源码研究之XposedInstaller(6)DownloadFragment
- hdu 3465 Life is a Line 树状数组求逆序数
- 【asp.net】常用内置对象(session,Application,ViewSate)
- [Elasticsearch] 过滤查询以及聚合(Filtering Queries and Aggregations) 5
- JAVA 集合