
这时,无论您是使用Back键退出还是手机自动重启,浏览器的缓存数据仍然存在. 然后问题来了. 如果要修改系统随附的浏览器主页,则必须首先找到一种清除浏览器数据的方法. 如何删除?与设置模块联系过的朋友将知道,长按APP菜单桌面的顶部将显示一个AppInfo,并将菜单放入后,窗口中将出现CLEARDATE信息. 顺便说一下,此功能按钮是用于清除数据的东西. 因此,输入设置后,请查看其处理方式. 进入设置搜索后,您会发现它实际上非常简单: 根据应用程序的程序包名称清除数据.
首先查看此方法:
private void initiateClearUserData() {
// Invoke uninstall or clear user data based on sysPackage
String packageName = "com.android.browser";//系统自带浏览器的包名
Log.i(TAG, "Clearing user data for package : " +packageName);
if (mClearDataObserver == null) {
mClearDataObserver = new ClearUserDataObserver();
}
ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
boolean res = am.clearApplicationUserData(packageName,mClearDataObserver);
if (!res) {
// Clearing data failed for some obscure reason. Just log error fornow
Log.i(TAG, "Couldnt clear application user data forpackage:"+packageName);
}
}
看到这种方法,我想您已经了解了,仅仅是这种方法吗?没有!您需要知道Android系统的保护机制非常好. 当您更改系统数据时,它将向您强加一条消息,即,如果数据被清除,则会发送广播通知系统. 看看这个ClearUserDataObserver()方法
class ClearUserDataObserver extends IPackageDataObserver.Stub{
public voidonRemoveCompleted(final String packageName, final booleansucceeded) {
finalMessage msg = mHandler.obtainMessage(CLEAR_USER_DATA);
msg.arg1 =succeeded ? OP_SUCCESSFUL : OP_FAILED;
mHandler.sendMessage(msg);
}
}
为什么使用CLEAR_USER_DATA标志位,然后查看代码

public static final boolean showShutdownDialog = false;
privatestatic final String TAG = "llcs";
privateClearUserDataObserver mClearDataObserver;
privatestatic final int CLEAR_USER_DATA = 1;
privatestatic final int OP_SUCCESSFUL = 1;
privatestatic final int OP_FAILED = 2;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
// If the fragment is gone, don't process any more messages.
Log.d(TAG, "handle message : " + msg.what);
switch (msg.what) {
case CLEAR_USER_DATA:
processClearMsg(msg);
break;
default:
break;
}
}
};
private void processClearMsg(Message msg) {
int result = msg.arg1;
Log.i(TAG, "Cleared user data result:" + result);
//String packageName = mAppEntry.info.packageName;
String packageName = "com.android.browser";
if(result == OP_SUCCESSFUL) {
Log.i(TAG, "Cleared user data for package : "+packageName);
//mState.requestSize(mAppEntry.info.packageName);
// M ALPS00235193: send the clear success broadcast {@
Intent packageDataCleared = newIntent(Intent.ACTION_SETTINGS_PACKAGE_DATA_CLEARED);
packageDataCleared.putExtra("packageName", packageName);
this.sendBroadcast(packageDataCleared);
// @}
} else {
Log.i(TAG, "fail to clear user data for package : " +packageName);
}
//checkForceStop();
}
好的,现在一切都已经明白了. 然后根据应用的程序包名称处理数据,最后通过广播发送清除成功消息. ACTION_SETTINGS_PACKAGE_DATA_CLEARED标志是清除了模块数据. 然后通过广播将其发送出去. 查看清理后,检查/data/data/com.android.browser下的内容,该内容将消失.
好!无需过多解释,只需调用initializeClearUserData()方法即可清除浏览器的缓存数据. 出于同样的原因,如果您想了解其他模块的数据,只需替换软件包名称即可. 清除缓存数据后,修改主页要容易得多. 我的方法是编写一个Settings.System.CHANGED_INTERNET,Settings.System.putString(MainActivity.this.getContentResolver(),Settings.System.CHANGED_INTERNET,“”);然后在浏览器中收到此字符串以替换原来的字符串.
注意: 此设置值需要由您自己定义. 定义的路径位于: frameworks / base / core / java / android / provider / Settings.java
第二个难题: 修改书签时同步更改书签缩略图的问题
此功能最初没有任何线索,尤其是书签缩略图的同步更改. 幸运的是,浏览器的是共享的,因此只需查找相应的字段即可轻松实现.

首先让我们看一下如何添加书签: 假设此时已添加了百度书签
private voidinsertBookMark() {
Resourcesres = this.getResources();
TypedArraypreloads = res.obtainTypedArray(R.array.bookmark_preloads);
ContentValues inputValue = new ContentValues();
//Bookmark值为1
inputValue.put(Browser.BookmarkColumns.BOOKMARK, 1);
//添加书签Title
inputValue.put(Browser.BookmarkColumns.TITLE, "baidu");
//添加书签URL
inputValue.put(Browser.BookmarkColumns.URL,
"http://www.baidu.com/");
intfaviconId = preloads.getResourceId(0, 0);
int thumbId = preloads.getResourceId(1, 0);
byte[] thumb= null, favicon = null;
try {
thumb = readRaw(res, thumbId);
} catch (IOException e) {
}
try {
favicon = readRaw(res, faviconId);
} catch (IOException e) {
}
inputValue.put(Browser.BookmarkColumns.FAVICON,
favicon);
//此为缩略图显示的图片
inputValue.put(Browser.BookmarkColumns.THUMBNAIL,
thumb);
//向浏览器添加该书签
ContentResolver contentResolver = getContentResolver();
contentResolver.insert(Browser.BOOKMARKS_URI, inputValue);
Toast.makeText(this, "添加成功!", Toast.LENGTH_LONG).show();
}
private byte[]readRaw(Resources res, int thumbId)throws IOException {
if (thumbId == 0) {
return null;
}
InputStream is = res.openRawResource(thumbId);
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[4096];
int read;
while ((read = is.read(buf)) > 0) {
bos.write(buf, 0, read);
}
bos.flush();
return bos.toByteArray();
} finally {
is.close();
}
//return null;
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shumachanpin/article-312835-1.html
有十万的人根本不在乎那100元
甲午海战北洋水师舰也不少
真来再戏耍它一番