Settings指令分析
来源:互联网 发布:怪物猎人初音捏脸数据 编辑:程序博客网 时间:2024/04/30 04:16
1, 概述
Settings指令也是和ContentProvider进行交互,对系统的数据库属性值进行查询、删除和修改。
2, Settings详细流程
SettingsCmd的main方法如下,
public static void main(String[] args) { if (args == null || args.length < 2) { printUsage(); return; } mArgs = args; try { new SettingsCmd().run(); } catch (Exception e) { System.err.println("Unable to run settings command"); } }
直接调用run方法,方法如下,
public void run() { boolean valid = false; String arg; try { while ((arg = nextArg()) != null) { if ("--user".equals(arg)) { if (mUser != -1) { // --user specified more than once; invalid break; } mUser = Integer.parseInt(nextArg()); } else if (mVerb == CommandVerb.UNSPECIFIED) { if ("get".equalsIgnoreCase(arg)) { mVerb = CommandVerb.GET; } else if ("put".equalsIgnoreCase(arg)) { mVerb = CommandVerb.PUT; } else if ("delete".equalsIgnoreCase(arg)) { mVerb = CommandVerb.DELETE; } else if ("list".equalsIgnoreCase(arg)) { mVerb = CommandVerb.LIST; } else { // invalid System.err.println("Invalid command: " + arg); break; } } else if (mTable == null) { if (!"system".equalsIgnoreCase(arg) && !"secure".equalsIgnoreCase(arg) && !"global".equalsIgnoreCase(arg)) { System.err.println("Invalid namespace '" + arg + "'"); break; // invalid } mTable = arg.toLowerCase(); if (mVerb == CommandVerb.LIST) { valid = true; break; } } else if (mVerb == CommandVerb.GET || mVerb == CommandVerb.DELETE) { mKey = arg; if (mNextArg >= mArgs.length) { valid = true; } else { System.err.println("Too many arguments"); } break; } else if (mKey == null) { mKey = arg; // keep going; there's another PUT arg } else { // PUT, final arg mValue = arg; if (mNextArg >= mArgs.length) { valid = true; } else { System.err.println("Too many arguments"); } break; } } } catch (Exception e) { valid = false; } if (valid) { if (mUser < 0) { mUser = UserHandle.USER_OWNER; } try { IActivityManager activityManager = ActivityManagerNative.getDefault(); IContentProvider provider = null; IBinder token = new Binder(); try { ContentProviderHolder holder = activityManager.getContentProviderExternal( "settings", UserHandle.USER_OWNER, token); if (holder == null) { throw new IllegalStateException("Could not find settings provider"); } provider = holder.provider; switch (mVerb) { case GET: System.out.println(getForUser(provider, mUser, mTable, mKey)); break; case PUT: putForUser(provider, mUser, mTable, mKey, mValue); break; case DELETE: System.out.println("Deleted " + deleteForUser(provider, mUser, mTable, mKey) + " rows"); break; case LIST: for (String line : listForUser(provider, mUser, mTable)) { System.out.println(line); } break; default: System.err.println("Unspecified command"); break; } } finally { if (provider != null) { activityManager.removeContentProviderExternal("settings", token); } } } catch (Exception e) { System.err.println("Error while accessing settings provider"); e.printStackTrace(); } } else { printUsage(); } }
如果是put指令,则会调用putForUser方法
void putForUser(IContentProvider provider, int userHandle, final String table, final String key, final String value) { final String callPutCommand; if ("system".equals(table)) callPutCommand = Settings.CALL_METHOD_PUT_SYSTEM; else if ("secure".equals(table)) callPutCommand = Settings.CALL_METHOD_PUT_SECURE; else if ("global".equals(table)) callPutCommand = Settings.CALL_METHOD_PUT_GLOBAL; else { System.err.println("Invalid table; no put performed"); return; } try { Bundle arg = new Bundle(); arg.putString(Settings.NameValueTable.VALUE, value); arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle); provider.call(resolveCallingPackage(), callPutCommand, key, arg); } catch (RemoteException e) { System.err.println("Can't set key " + key + " in " + table + " for user " + userHandle); } }
如果是get指令,则会调用getForUser方法,
String getForUser(IContentProvider provider, int userHandle, final String table, final String key) { final String callGetCommand; if ("system".equals(table)) callGetCommand = Settings.CALL_METHOD_GET_SYSTEM; else if ("secure".equals(table)) callGetCommand = Settings.CALL_METHOD_GET_SECURE; else if ("global".equals(table)) callGetCommand = Settings.CALL_METHOD_GET_GLOBAL; else { System.err.println("Invalid table; no put performed"); throw new IllegalArgumentException("Invalid table " + table); } String result = null; try { Bundle arg = new Bundle(); arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle); Bundle b = provider.call(resolveCallingPackage(), callGetCommand, key, arg); if (b != null) { result = b.getPairValue(); } } catch (RemoteException e) { System.err.println("Can't read key " + key + " in " + table + " for user " + userHandle); } return result; }
如果是delete指令,则会调用deleteForUser方法,
int deleteForUser(IContentProvider provider, int userHandle, final String table, final String key) { Uri targetUri; if ("system".equals(table)) targetUri = Settings.System.getUriFor(key); else if ("secure".equals(table)) targetUri = Settings.Secure.getUriFor(key); else if ("global".equals(table)) targetUri = Settings.Global.getUriFor(key); else { System.err.println("Invalid table; no delete performed"); throw new IllegalArgumentException("Invalid table " + table); } int num = 0; try { num = provider.delete(resolveCallingPackage(), targetUri, null, null); } catch (RemoteException e) { System.err.println("Can't clear key " + key + " in " + table + " for user " + userHandle); } return num; }
如果是list指令,则会调用listForUser方法
private List<String> listForUser(IContentProvider provider, int userHandle, String table) { final Uri uri = "system".equals(table) ? Settings.System.CONTENT_URI : "secure".equals(table) ? Settings.Secure.CONTENT_URI : "global".equals(table) ? Settings.Global.CONTENT_URI : null; final ArrayList<String> lines = new ArrayList<String>(); if (uri == null) { return lines; } try { final Cursor cursor = provider.query(resolveCallingPackage(), uri, null, null, null, null, null); try { while (cursor != null && cursor.moveToNext()) { lines.add(cursor.getString(1) + "=" + cursor.getString(2)); } } finally { if (cursor != null) { cursor.close(); } } Collections.sort(lines); } catch (RemoteException e) { System.err.println("List failed in " + table + " for user " + userHandle); } return lines; }
0 0
- Settings指令分析
- Settings分析
- Android Settings应用分析
- Android Settings模块分析
- Android4.2.2 settings分析
- Settings源码分析
- Android Settings模块分析
- android 4.4 Settings分析
- Android Settings模块分析
- android Settings 分析
- Scrapy-settings源码分析
- Settings源码分析
- MTK Camera Settings分析
- Xcode Build Settings 分析
- Settings界面分析之Settings一级界面
- Settings界面分析之Settings一级界面
- Settings PreferenceActivity aidl AT指令 pppd拨号上网
- Android 应用程序分析之Settings
- cf246c
- C++动态内存管理
- C语言的数据类型及范围
- MFC画笔CPen类
- 二维数组的查找
- Settings指令分析
- Java实现十大排序方法
- 【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
- 正则表达式入门
- 通过OnScrollListener来监听RecyclerView的位置
- IDEA的入门使用(二)——插件
- SDUT 3769 分割 超大数据加一位数 比较大小
- Flume-ng源码解析之Channel组件
- 在maven项目移植时,Maven Dependencies不见了!!!