日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手机卫士-11

發布時間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手机卫士-11 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

手機衛士-11

課1

看門狗WatchDogService程序優化

程序鎖不斷打開關閉打開關閉,有時還是有界面沒及時切換過來 有一瞬間還看見程序的界面,隱私還是保護得不夠好 原因是看門狗里WatchDogService.java里死循環,整個死循環的周期有一定的事件,所以會產生多次打開程序鎖而界面沒切換過來 那是因為應用程序還不夠優化

//該標志符用來控制是否不斷刷新 flag = true; new Thread() {//其實該service所做的事件就是創建一個死循環,不斷查看tempStopPacknames集合里的數據和新打開的app,從而進行比較操作public void run() {//如果為true就進入死循環while (flag) {// 獲取用戶的正在運行的應用程序任務棧的列表,最近使用的在集合的最前面List<RunningTaskInfo> taskinfos = am.getRunningTasks(100);String packname = taskinfos.get(0).topActivity.getPackageName();System.out.println(packname);//對比獲得的最新加載的app的名字是否存在于加鎖app數據庫中:當在加鎖數據庫中找到該packname,那么再比較該packname的app有沒有通過密碼校驗if (dao.find(packname)) {//有通過密碼校驗// 檢查主人是否發過臨時停止保護的指令if (tempStopPacknames.contains(packname)) {// 什么事情都不做,即不再彈出程序鎖界面//沒有通過密碼校驗} else {// 這個應用程序需要被鎖定// 跳出來看門狗,讓用戶輸入密碼。Intent intent = new Intent(WatchDogService.this,WatchDogEnterPwdActivity.class);//給該WatchDogEnterPwdActivity.class設置一個開啟任務的模式intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//用意圖開啟界面,并加上應用的信息intent.putExtra("packname", packname);startActivity(intent);}}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}; }.start();

我們給WatchDogService.java里死循環里加個計算器來計算循環一個的時間。


這是在效率比較高的模擬器結果 換成一個arm的模擬器來部署一下應用


看看其效率如何


  • 如何優化?

處理細節: 在查詢數據庫的過程中不斷打開數據庫然后close,效率低,我們改造下ApplockDao.java,

ApplockDao.java

/*** 查詢全部的要鎖定的應用程序* @return 全部鎖定應用程序包名的集合*/ public List<String> findAll(){List<String> packnames = new ArrayList<String>();SQLiteDatabase db = helper.getWritableDatabase();Cursor cursor = db.query("lockinfo", null, null, null, null, null, null);while(cursor.moveToNext()){String packname = cursor.getString(cursor.getColumnIndex("packname"));packnames.add(packname);}cursor.close();db.close();//返回一個叫packnames的集合return packnames; }

把所有的數據一次取出來,放在內存中,然后讓看門狗去查看內存,這樣效率大大改善。 經過以上的改善,

得到如下的改善?

但是這樣的死循環非常耗電,占據的cpu資源大多,怎么解決?

搜搜地圖(相當費電,后來版本來個重大改變后,在鎖屏后gps的定位會占時關閉掉,這樣的改變可可以省不少的電量)--->騰訊地圖

需求:那么我們可以考慮,我們能否鎖屏后我們的看門狗是否可以停掉,打開鎖后看門狗會打開。

把看門狗中死循環的代碼抽取到子線程中去跑。 把線程封裝成一個方法

startDogThread();

然后讓死循環加入一個成員變量標記flag,在自定義廣播接受者出接收開關屏幕的廣播事件處理

else if (Intent.ACTION_SCREEN_OFF.equals(action)) {tempStopPacknames.clear();// 臨時停止看門狗flag = false; } else if (Intent.ACTION_SCREEN_ON.equals(action)) {// 開啟看門狗if (!flag) {startDogThread();} }receiver = new InnerReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.itheima.doggoaway"); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); registerReceiver(receiver, filter);

這樣又大大減低了電量的消耗

優化程序后的小bug,上鎖效果消失了?

在提高看門狗效率的同時還有bug:我們改造了ApplockDao的findAll時,這時看門狗只看集合內存里保存的應用集合,這樣如果當操作一個應用上鎖之后,再去鎖上別的應用時這個后被鎖上的app的上鎖效果就失效了,因為之前看門狗里的死循環是檢查private List tempStopPacknames;集合,現在是看新定義的private List lockPacknames;集合,以實現緩存的效果,當在點擊listview里的加鎖和解鎖的按鈕時,它們操作的是數據庫dao的add和delete的方法,而方法是繼續調用數據庫的操作,看門狗根本不知道數據庫也發生了變化,那么如果我們怎么解決?

改造ApplockDao的add和delete,發送自定義廣播,當我們進行上鎖的動畫操作時,會對數據庫進行操作,那么我們讓ApplockDao的add和delete加上自定義廣播,讓看門狗接收這自定義的廣播,這就可以讓看門狗知道需要對數據庫進行增刪的操作了。在看門狗里這樣接收廣播

ApplockDao.java

/*** 添加一條鎖定的應用程序* @param packname 包名*/ public void add(String packname){SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("packname", packname);db.insert("lockinfo", null, values);db.close();//通知看門狗更新鎖定的應用程序集合Intent intent = new Intent();intent.setAction("com.itheima.mobilesafe.notifydogadd");intent.putExtra("packname", packname);context.sendBroadcast(intent); }/*** 刪除一條鎖定的應用程序* @param packname 包名*/ public void delete(String packname){SQLiteDatabase db = helper.getWritableDatabase();db.delete("lockinfo", "packname=?", new String[]{packname});db.close();//通知看門狗更新鎖定的包名集合Intent intent = new Intent();intent.setAction("com.itheima.mobilesafe.notifydogdelete");intent.putExtra("packname", packname);context.sendBroadcast(intent); }

WatchDogService.java

else if("com.itheima.mobilesafe.notifydogadd".equals(action)){lockPacknames.add(intent.getStringExtra("packname")); }else if("com.itheima.mobilesafe.notifydogdelete".equals(action)){lockPacknames.remove(intent.getStringExtra("packname")); }receiver = new InnerReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.itheima.mobilesafe.notifydogdelete"); filter.addAction("com.itheima.mobilesafe.notifydogadd"); registerReceiver(receiver, filter);

總結:廣播很靈活,這里使用了自定義廣播讓不同應用或組件之間發送消息接收消息實現通信!!! 改善后的看門狗WatchDogService和 ApplockDao的完整邏輯

WatchDogService.java

/*** 監視當前用戶操作的應用程序,如果這個應用程序需要保護,看門狗就蹦出來,讓用戶輸入密碼* //其實該service所做的事件就是創建一個死循環,不斷查看tempStopPacknames集合里的數據和新打開的app,從而進行比較操作* @author Administrator* */ public class WatchDogService extends Service {private Intent intent;private String packname;//應用管理器private ActivityManager am;private boolean flag;// 程序鎖的數據庫daoprivate ApplockDao dao;//內部廣播類private InnerReceiver receiver;/*** 臨時停止保護的包名集合*/private List<String> tempStopPacknames;private List<String> lockPacknames;@Overridepublic IBinder onBind(Intent intent) {return null;}//內部廣播類:該廣播類主要是操作tempStopPacknames集合,即操作從程序鎖界面傳來的應用的名字和操作鎖屏的狀態中//集合的清空,把集合提供給service去控制應用的加鎖效果//專門獲取程序界面中傳來的廣播信號,通知WatchDogService去解除程序鎖界面private class InnerReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//廣播一直接收所有的頻道信息String action = intent.getAction();//獲取WatchDogEnterPwdActivity傳來的StringExtraif("com.itheima.doggoaway".equals(action)){//StringExtra的keyString packname = intent.getStringExtra("packname");//看門狗把主人要求臨時停止保護的包名給記錄下來,即把WatchDogEnterPwdActicity傳來的//StringExtra:packname,把其app加入臨時停止保護的集合中tempStopPacknames.add(packname);}else if(Intent.ACTION_SCREEN_OFF.equals(action)){//當接收的廣播頻道是鎖屏,就把臨時停止保護的應用集合清零,即讓下次打開要保護的應用再次輸入密碼tempStopPacknames.clear();//停止看門狗flag = false;}else if(Intent.ACTION_SCREEN_ON.equals(action)){//當接收的廣播頻道是打開屏幕,if(!flag){startDogThread();}}else if("com.itheima.phonesafeguard.notifydogadd".endsWith(action)){lockPacknames.add(intent.getStringExtra("packname"));}else if("com.itheima.phonesafeguard.notifydogdelete".equals(action)){lockPacknames.remove(intent.getStringExtra("packname"));}}}@Overridepublic void onCreate() {//初始化臨時取消保護的app的集合tempStopPacknames = new ArrayList<String>();//獲取操作加鎖app的數據庫的接口dao = new ApplockDao(this);//一旦服務開啟集合的內容就不會再發生變化lockPacknames = dao.findAll();intent = new Intent(WatchDogService.this,WatchDogEnterPwdActivity.class);//給該WatchDogEnterPwdActivity.class設置一個開啟任務的模式intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK);receiver = new InnerReceiver();IntentFilter filter = new IntentFilter();filter.addAction("com.itheima.doggoaway");filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);filter.addAction("com.itheima.phonesafeguard.notifydogadd");filter.addAction("com.itheima.phonesafeguard.notifydogdelete");registerReceiver(receiver, filter);am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);startDogThread();super.onCreate();}private void startDogThread(){flag = true;new Thread(){//其實該service所做的事件就是創建一個死循環,不斷查看//tempStopPacknames集合里的數據和新打開的app,從而進行比較操作public void run() {//如果為true就進入死循環while(flag){//獲取用戶的正在運行的應用程序任務棧的列表,最近使用的在集合的最前面List<RunningTaskInfo> taskinfos = am.getRunningTasks(1);packname = taskinfos.get(0).topActivity.getPackageName();System.out.println(packname);//對比獲得的最新加載的app的名字是否存在于加鎖app數據庫中;//當在加鎖數據庫中找到該packname,那么再比較該packname的app有沒有通過密碼校驗 // if(dao.find(packname)){if(lockPacknames.contains(packname)){// 查詢內存//有通過密碼校驗//檢查主人是否發過臨時停止保護的指令if(tempStopPacknames.contains(packname)){//什么事情都不做,即不在彈出程序鎖界面//沒有通過密碼校驗}else{//用意圖開啟界面,并加上應用的消息intent.putExtra("packname", packname);startActivity(intent);}}try {Thread.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}}};}.start();}@Overridepublic void onDestroy() {flag = false;//動態注銷廣播unregisterReceiver(receiver);receiver = null;super.onDestroy();}}

ApplockDao.java

/*** 程序鎖增刪改查的業務類**/ public class ApplockDao {private ApplockDBHelper helper ;private Context context;public ApplockDao(Context context){helper = new ApplockDBHelper(context);this.context = context;}/*** 添加一條鎖定的應用程序* @param packname 包名*/public void add(String packname){SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("packname", packname);db.insert("lockinfo", null, values);db.close();//通知看門狗更新鎖定的應用程序集合Intent intent = new Intent();intent.setAction("com.itheima.phonesafeguard.notifydogadd");intent.putExtra("packname", packname);context.sendBroadcast(intent);}/*** 刪除一條鎖定的應用程序* @param packname 包名*/public void delete(String packname){SQLiteDatabase db = helper.getWritableDatabase();db.delete("lockinfo", "packname=?", new String[]{packname});db.close();//通知看門狗更新鎖定的包名集合Intent intent = new Intent();intent.setAction("com.itheima.phonesafeguard.notifydogdelete");intent.putExtra("packname", packname);context.sendBroadcast(intent);}/*** 查詢一條鎖定的應用程序* @param packname 包名* @return true 被鎖定false 沒有鎖定*/public boolean find(String packname){boolean result = false;SQLiteDatabase db = helper.getWritableDatabase();Cursor cursor = db.query("lockinfo", null, "packname=?", new String[]{packname}, null, null, null);if(cursor.moveToNext()){result = true;}cursor.close();db.close();return result;}/*** 查詢全部的要鎖定的應用程序* @return 全部鎖定應用程序包名的集合*/public List<String> findAll() {List<String> packnames = new ArrayList<String>();SQLiteDatabase db = helper.getWritableDatabase();Cursor cursor = db.query("lockinfo", null, null , null, null, null, null); while(cursor.moveToNext()){String packname = cursor.getString(cursor.getColumnIndex("packname"));packnames.add(packname);}cursor.close();db.close();//返回一個叫packnames的集合return packnames;} }

課2

Activity的啟動模式重溫

  • standard 標準啟動模式

  • singletop 單一頂部模式

    如果棧頂已經存在了activity,就不會重復的創建,而是復用棧頂已經存在的activity(瀏覽器的書簽)

  • singletask 單一任務棧模式

    在任務棧里面只能存在一個實例,這個實例是存在在手機衛士默認的任務棧里面的

  • singleinstance 單例模式

    在任務棧里面只能存在一個實例,這個實例是在自己單獨新建的任務棧里面 6

  • 修改成7 其實這些啟動模式都是為了解決用戶的體驗感受的 程序鎖開發結束

    流量統計

    開始流量統計模塊 新建TrafficManagerActivity.java并配置清單文件

    TrafficManagerActivity.java

    public class TrafficManagerActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);<!-- 流量統計 --> <activity android:name="com.itheima.mobile47.TrafficManagerActivity"></activity>

    MainActivity加入節點case MainActivity.java

    case 4://流量管理intent = new Intent(MainActivity.this,TrafficManagerActivity.class);startActivity(intent);break;

    安卓下如何獲取系統的流量信息?

    類比:Windows-->網絡連接-->本地連接(網卡信息)可以統計出流量信息 安卓:TrafficStats類

    Class that provides network traffic statistics. These statistics include bytes transmitted and received and network packets transmitted and received, over all interfaces, over the mobile interface, and on a per-UID basis. TrafficStats類的重要api

    //獲取手機所有的網絡端口 , wifi , 2g/3g/4g(手機卡產生的流量) TrafficStats.getTotalRxBytes(); //r -->receive接收,獲取全部的接受的byte (下載) TrafficStats.getTotalTxBytes(); //t -->translate發送,獲取全部的發送的byte (上傳)TrafficStats.getMobileRxBytes();// 手機卡下載產生的流量 從開機開始到現在產出的流量 TrafficStats.getMobileTxBytes();// 手機卡上傳產生的流量


    流量管理app由于TrafficStats類api的特點:

    TrafficStats.getMobileRxBytes();// 手機卡下載產生的流量 從開機開始到現在產出的流量?
    一般每5分鐘計算一次流量,一天下來就相加,來計算一個總的流量消耗量。

    其實流量管理的app的程序邏輯無非是計時器和數據庫的操作

    該方法就是獲取某個應用程序的流量,每個應用程序都有一個對應的uid用戶id,就因為有了內核uid,每個程序就有了不同的權限,換句話說,每個應用程序都有一個uid。

    //在Android系統里面 ,給每一個應用程序都分配了一個用戶id //pid:進程id uid:用戶id TrafficStats.getUidRxBytes(10014); TrafficStats.getUidTxBytes(10014);


    獲得3g/wifi產生了多少的流量

    //分別列出來3g/wifi產生了多少的流量 //計時器。 ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); cm.getActiveNetworkInfo().getType();

    //自動校驗流量 , 偷偷后臺給運營商發送短信。 //10010 10086 llcx

    //聯網禁用 //linux平臺的防火墻軟件。必須手機要有root權限,修改iptable

    實現騰訊的抽屜效果


    TrafficManagerActivity.java的布局 activitytrafficmanager.xml 抽屜控件 要使用必須給該控件定義一個id TrafficManagerActivity.java

    <SlidingDrawerandroid:orientation="horizontal"android:id="@+id/my_drawer"android:layout_width="match_parent"android:layout_height="match_parent"></SlidingDrawer>

    但是其實一個也不夠(設計界面報錯),還要定義很多個id:給把手handle也定義一個id,還有content內容也要定義一個id(還報錯),

    <SlidingDrawerandroid:orientation="horizontal"android:id="@+id/my_drawer"android:layout_width="match_parent"android:layout_height="match_parent"android:content="@+id/my_content"android:handle="@+id/my_handle"> </SlidingDrawer>

    還需定義一個ImageView,然后imageview的id要引用SlidingDrawer的handle的id,

    <SlidingDrawerandroid:orientation="horizontal"android:id="@+id/my_drawer"android:layout_width="match_parent"android:layout_height="match_parent"android:content="@+id/my_content"android:handle="@+id/my_handle" ><ImageViewandroid:id="@id/my_handle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher" /></SlidingDrawer>

    還有LinearLayout里要引用SlidingDrawer的content的id,

    <SlidingDrawerandroid:orientation="horizontal"android:id="@+id/my_drawer"android:layout_width="match_parent"android:layout_height="match_parent"android:content="@+id/my_content"android:handle="@+id/my_handle" ><ImageViewandroid:id="@id/my_handle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher" /><LinearLayoutandroid:background="#22000000"android:id="@id/my_content"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical" ><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是抽屜里面的內容,哈哈哈"/></LinearLayout> </SlidingDrawer>


    注意要把該布局文件復制過來! 這是從下往上拉 我們可以改變里orientation的屬性去改變拉的方向

    課3

    實現金山手機衛士小功能:常用手機號碼的效果

    金山手機衛士小功能:常用手機號碼:


    (listview嵌套這listview) 把金山apk里的數據庫文件拷貝過來?

    觀察其數據庫 把數據庫信息展現到我們想實現的效果里 新建CommonNumberActivity.java和配置清單文件

    CommonNumberActivity.java

    public class CommonNumberActivity extends Activity {

    private static final String path = "/data/data/com.itheima.mobile47/files/commonnum.db"; private ExpandableListView elv; private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_common_num);

    清單文件

    <!-- 常用號碼查詢 --> <activity android:name="com.itheima.mobile47.CommonNumberActivity"/>

    布局怎么寫呢? activitycommonnum.xml

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ><TextViewstyle="@style/textview_title_style"android:text="常用號碼查詢" /><ExpandableListViewandroid:id="@+id/elv"android:layout_width="match_parent"android:layout_height="match_parent" ></ExpandableListView></LinearLayout>

    使用ExpandableListView控件,這樣的控件可以實現我們想要的效果 在CommonNumberActivity.java加載ExpandableListView控件。 ExpandableListView控件是Listview的子類。 在實現該控件的adapter的實現類時,如圖


    這樣實現了接口中太多的方法,換成繼承BaseExpandableListAdapter 這靠譜 里面有方法我們需要的不多, 寫個界面加入到高級工具里 activity_tools.xml+ToolsActivity.java修改,進入到CommonNumberActivity.java

    的效果如下



    把數據庫的內容加載到ExpandableListView控件里

    先把數據庫放到assets里 我們改造SplashActivcity-->copyDB--->data\data目錄下 SplashActivcity.java

    try {// 拷貝數據庫到data/data目錄下面copyDB("address.db");copyDB("commonnum.db");

    新建CommonNumberDao.java:獲取到數據庫的路徑,然后就是操作數據庫獲取數據庫的信息

    CommonNumberDao.java

    /*** 獲取數據庫里面一共有多少個分組* @return*/ public static int getGroupCount(SQLiteDatabase db){Cursor cursor = db.rawQuery("select count(*) from classlist", null);cursor.moveToNext();int groupcount = cursor.getInt(0);cursor.close();return groupcount; }

    CommonNumberDao.java:

    1、獲取數據庫里面一共有多少個分組 2、獲取數據庫里面某個分組有多少個孩子 3、獲取數據庫里面某個分組的名字 4、獲取數據庫里面某個分組里面某個孩子的名字和電話

    改造完CommonNumberDao.java后,回到CommonNumberActivity.java里的adapter進行改造。

    CommonNumberActivity.java

    //BaseXXX SimpleXXX DefaultXXX BaiscXXXX private class CommonNumAdapter extends BaseExpandableListAdapter{//獲取分組的數量@Overridepublic int getGroupCount() {return CommonNumberDao.getGroupCount(db);}//獲取孩子的數量@Overridepublic int getChildrenCount(int groupPosition) {return CommonNumberDao.getChildrenCount(db,groupPosition);}@Overridepublic Object getGroup(int groupPosition) {return null;}@Overridepublic Object getChild(int groupPosition, int childPosition) {return null;}@Overridepublic long getGroupId(int groupPosition) {return 0;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return 0;}@Overridepublic boolean hasStableIds() {return false;}//獲取分組顯示的view@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {TextView tv;if(convertView!=null && convertView instanceof TextView){tv = (TextView) convertView;}else{tv= new TextView(getApplicationContext());}tv.setTextSize(20);tv.setTextColor(Color.RED);tv.setText(" "+CommonNumberDao.getGroupNameByPosition(db,groupPosition));return tv;}//獲取某個位置的孩子的view對象@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {TextView tv;if(convertView!=null && convertView instanceof TextView){tv = (TextView) convertView;}else{tv= new TextView(getApplicationContext());}tv.setTextSize(16);tv.setTextColor(Color.BLACK);String info = CommonNumberDao.getChildInfoByPosition(db,groupPosition, childPosition);tv.setText(info.split("#")[0]+"\n"+info.split("#")[1]);return tv;}//指定孩子可以被點擊@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}}

    運行:


    但是不斷滑動時的最后app還是掛了,報出了內存溢出 改善程序:?

    view復用 還有bug:展開所有,然后不斷拖動,也不會掛掉。但是如果拖動個幾千次上萬次,有可能數據打不開了,原因也是程序不斷打開關閉打開關閉的操作也讓數據庫最后垮了,

    改造:數據庫改成在onCreate里打開,

    @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_common_num);db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);

    然后在onDestroy里關閉數據庫,同時要在CommonNumberDao.java里的增刪查改api把數據庫對象傳過來

    @Override protected void onDestroy() {super.onDestroy();db.close(); }

    如果想讓孩子條目可以被點擊,首先要設置如下:

    //指定孩子可以被點擊 @Override public boolean isChildSelectable(int groupPosition, int childPosition) {return true; } 然后在控件對象上設置:elv = (ExpandableListView) findViewById(R.id.elv); elv.setAdapter(new CommonNumAdapter()); elv.setOnChildClickListener(new OnChildClickListener() {@Overridepublic boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {System.out.println("被點擊了。"+CommonNumberDao.getChildInfoByPosition(db, groupPosition, childPosition));return false;} });


    課4

    緩存清理模塊:獲取緩存信息 (建議看多一次視頻:實用!)

    緩存清理模塊介紹 什么是緩存?

    data/data里的cache文件夾 每一個文件夾有可以創建一個cache的文件夾緩存文件

    一個應用程序如何生成緩存?

    新建工程:緩存測試

    public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getFilesDir();//得到應用程序在文件系統上的路徑 /data/data/包名/filesgetCacheDir();//應用程序有臨時的數據需要保存 ,就可以存放在cache目錄,/data/data/包名/cachetry {File file = new File(getCacheDir(),"gaga.txt");FileOutputStream fos = new FileOutputStream(file);fos.write("sfdaf".getBytes());fos.close();} catch (Exception e) {e.printStackTrace();}}}


    新建了工程后就可以使用金山手機位置使用緩存清理功能,可以搜出該工程產生的緩存文件。?

    在手機設置里的應用欄目也會顯示:?

    一般我們從網上下載了一些臨時的圖片,應用會自動放在cache里,當在手機設置里的應用欄目點擊清空緩存,可以把cache刪除。

    新建工程:獲取緩存測試

    劃紅線的數據谷歌怎么賦值的? 我們看系統上層所有的源碼中找到Setting 在工程里導入Setting,為了查找里面的源碼實現。 查找技巧,先搜界面,然后再搜java代碼,看源碼是怎么給劃紅線的數據賦值的 ctr+h--->全局搜索 緩存+*.xml?

    然后根據線索一步一步的最后定位到了res--->cachesizetext--->InstalledAppDetails.java,獲取緩存的方法很明顯都在該java文件里

    目標InstalledAppDetails.java,在該類里可以找到谷歌如何給劃紅線的數據賦值(緩存)

    ctr+k快速搜索 下次嘗試操作尋找下。

    源碼定位的邏輯:

    我們的目標是劃紅線的緩存數據谷歌是怎么賦值

    1、從布局出發:首先在Eclipse里使用ctr+h全局搜索:緩存 *.xml

    2、從搜索到的信息


    這是在setting源碼中布局文件xml中出現過的字段,打開文件可以找到該字段的來源

    <string name="cache_header_label" msgid="1877197634162461830">"緩存"</string> <string name="clear_cache_btn_text" msgid="5756314834291116325">"清除緩存"</string> <string name="cache_size_label" msgid="7505481393108282913">"緩存"</string>

    3、根據這個來源再繼續全局搜索:cachesizelabel *.xml,這樣的目的是繼續搜索到設置中心的布局文件,并找到布局文件中cachesizelabel的id,搜索結果是installedappdetails.xml出現過cachesizelabel這個id


    4、根據該布局文件可以分析出顯示緩存的數字的變量是:

    <TextViewandroid:id="@+id/cache_size_text"android:textAppearance="?android:attr/textAppearanceMedium"android:paddingTop="6dip"android:paddingRight="6dip"android:layout_height="wrap_content"android:layout_width="wrap_content"android:maxLines="1" />

    5、繼續使用全局搜索:cachesizetext *.java,這樣可以搜到cachesizetext出自于哪個類文件:搜索結果是InstalledAppDetails.java里的一段代碼

    // Cache sectionmCacheSize = (TextView) findViewById(R.id.cache_size_text);

    6、繼續順藤摸瓜:搜索: mCacheSize:找到一段關鍵代碼:

    if (mLastCacheSize != mAppEntry.cacheSize) { mLastCacheSize = mAppEntry.cacheSize; mCacheSize.setText(getSizeStr(mAppEntry.cacheSize));

    7、我們繼續點進cacheSize觀察其來自于哪里:然后定位到了目標類ApplocationState.java,并發現了一段關鍵代碼:

    public static class SizeInfo {long cacheSize;long codeSize;long dataSize; }

    8、然后繼續搜索,然后定位到了最關鍵的代碼塊:分析:


    9、最后搜索遠程服務接口的實現類對象:mStatsObserver,最后定位到以下這段代碼:


    10、然后我們在工程里使用PackageManager類來使用getPackageSizeInfo方法去獲取緩存值,但是遺憾的是,谷歌早就把getPackageSizeInfo方法給隱藏起來了:因此我們可以考慮使用反射的方法來獲取該方法

    /*** Retrieve the size information for a package.* Since this may take a little while, the result will* be posted back to the given observer. The calling context* should have the {@link android.Manifest.permission#GET_PACKAGE_SIZE} permission.** @param packageName The name of the package whose size information is to be retrieved* @param userHandle The user whose size information should be retrieved.* @param observer An observer callback to get notified when the operation* is complete.* {@link android.content.pm.IPackageStatsObserver#onGetStatsCompleted(PackageStats, boolean)}* The observer's callback is invoked with a PackageStats object(containing the* code, data and cache sizes of the package) and a boolean value representing* the status of the operation. observer may be null to indicate that* no callback is desired.** @hide*/ public abstract void getPackageSizeInfo(String packageName, int userHandle,IPackageStatsObserver observer);

    繼續在工程里獲取緩存

    技巧:如何觀看安卓源碼的某一個類中的某一個對象

    在程序中打一個斷點。 我們使用debug窗口去查看我們要了解的一些比較難理解的類,配合搜索工具來找出其源碼父類的實現類。

    code.google.com www.github.com 我們工作的好幫手

    使用反射機制拿出PackAgeManager類里被隱藏的方法:getPackageSizeInfo

    然后還需調用遠程服務 實現遠程服務的接口 一系列工程完成后就可以獲取緩存。


    還有權限要加上:

    獲取緩存的邏輯(結合上面如何觀察源碼的方法和結論)

    1、布局文件:需求:就是在輸入框里輸入一個應用的包名,然后點擊確定按鈕,就可以在控制臺返回緩存的size

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" ><EditTextandroid:hint="請輸入要獲取的應用程序的包名"android:id="@+id/et_packname"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:onClick="click"android:text="獲取緩存信息" /></RelativeLayout>

    2、從之前源碼分析中知道我們可以從PackageManager類里獲取getPackageSizeInfo方法來獲取緩存size,因此我們獲取到PackageManager類對象pm,然后快捷鍵發現方法獲取不出來,查看PackageManager發現該方法是個抽象方法,也就是被谷歌隱藏了(hide)

    3、那么我們就應該想辦法怎么獲得那個方法,方法就是(重要!)使用debug的方法來觀察其PackageManager的實現類是什么?我們隨便在程序中輸出些什么,然后在該輸出的地方打上一個斷點

    public class MainActivity extends Activity { private EditText et_packname; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_packname = (EditText) findViewById(R.id.et_packname); }public void click(View view){//獲取某個應用程序的緩存String packname = et_packname.getText().toString().trim();//使用該類可以獲取到緩存的方法getPackageSizeInfoPackageManager pm = getPackageManager();//但是該方法getPackageSizeInfo被谷歌隱藏,其在PackageManager類里只是一個抽象的方法,被隱藏了,那么技巧就是我們隨便在程序中輸出些東西,并打上斷點//以此來獲取PackageManager里的內容System.out.println("----");

    4、然后我們進入debug視圖觀察得到結果:其PackageManager的實現類就是:ApplicationPackageManager,找到其源碼發現:的確是繼承PackageManager并發現:

    /*package*/ final class ApplicationPackageManager extends PackageManager {private static final String TAG = "ApplicationPackageManager";private final static boolean DEBUG = false;private final static boolean DEBUG_ICONS = false;并發現的確有方法 @Override public void getPackageSizeInfo(String packageName, int userHandle,IPackageStatsObserver observer) {try {mPM.getPackageSizeInfo(packageName, userHandle, observer);} catch (RemoteException e) {// Should never happen!} }

    5、那么我們就可以使用反射的機制把其方法反射出來了:

    //pm.getPackageSizeInfo(); //這樣可以拿到PackageManager實現類的字節碼Method[] methods = PackageManager.class.getMethods();for(Method method : methods){if("getPackageSizeInfo".equals(method.getName())){try {method.invoke(pm, packname,new MyObserver());} catch (Exception e) {e.printStackTrace();}}}

    6、觀察源碼中的方法,其 mPM.getPackageSizeInfo(packageName, userHandle, observer);中的參數是一個遠程服務實現類:因為在之前的源碼分析中得到的結論,那么我們必須找到該遠程服務的aidl文件復制過來放在我們的工程目錄下(注意包名要和原文件里的包名一致)

    7、把aidl遠程服務接口文件設置好后,就可以把其遠程服務的類定義出來并實現,并傳到反射出來的getPackageSizeInfo()方法里了。

    private class MyObserver extends android.content.pm.IPackageStatsObserver.Stub{@Overridepublic void onGetStatsCompleted(PackageStats pStats, boolean succeeded)throws RemoteException {long size = pStats.cacheSize;System.out.println("緩存大小為:"+Formatter.formatFileSize(getApplicationContext(), size));} }

    8、最后使用該方法還需要獲取權限:

    <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>

    課5

    手機衛士開發:緩存清理 (重看視頻如何引入源碼中的progressBar樣式然后如何自定義)

    開發緩存清理 新建CleanCacheActivity.java+配置清單

    在MainActivity.java增加點擊事件case 6

    需求UI:

    布局:activitycleancache.xml 在布局里引用了一個progressBar的特殊樣式。在源碼那里復制過來的。 在CleanCacheActivity.java加載自定義的progressBar,測試其效果。 需求:就是在進度條進行完后就顯示被進度條覆蓋的信息。 需求:模仿騰訊:每掃描一條cache,即顯示一行信息條目,動態的顯示(難) 繼續實現布局:activitycleancache.xml activitycleancache.xml

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewstyle="@style/textview_title_style"android:gravity="center"android:text="清理緩存" /><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><ProgressBarandroid:id="@+id/pb_scan"android:layout_width="fill_parent"android:layout_height="15dip"android:indeterminateOnly="false"android:progressDrawable="@drawable/progress_horizontal" /><TextViewandroid:id="@+id/tv_scan_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="adfadsfa" /></FrameLayout><ScrollViewandroid:layout_width="match_parent"android:layout_height="0dip"android:layout_weight="1" ><LinearLayoutandroid:id="@+id/ll_container"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ></LinearLayout></ScrollView><Buttonandroid:onClick="cleanAll"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="清理全部" /></LinearLayout>

    (觀察源碼后學習的進度條樣式)progress_horizontal.xml

    <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2008 The Android Open Source ProjectLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--><layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@android:id/background" android:drawable="@drawable/security_progress_bg"></item><item android:id="@android:id/secondaryProgress" android:drawable="@drawable/security_progress"></item><item android:id="@android:id/progress" android:drawable="@drawable/security_progress"></item></layer-list>


    • CleanCacheActivity.java編程
    • 初始化控件
    • 掃描所有的應用程序,查看他們的緩存信息;
    • 掃描應用方法:scan(),耗時,所以放在子線程里。
    • 獲取緩存getCacheInfo(String packname)
    • 在掃描應用方法里去獲取應用的cache信息。

      public class CleanCacheActivity extends Activity {protected static final int SCANNING = 1;protected static final int FINISHED = 2;public static final int ADD_CACHE_VIEW = 3;private TextView tv_scan_result;private ProgressBar pb_scan;private LinearLayout ll_container;private PackageManager pm;private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case SCANNING://這樣可以讓子線程中遍歷的應用信息滾動PackageInfo info = (PackageInfo) msg.obj;tv_scan_result.setText("正在掃描:"+ info.applicationInfo.loadLabel(pm));break;case ADD_CACHE_VIEW:break;case FINISHED://遍歷完應用接收到該信號就把UI中的TextView隱藏掉tv_scan_result.setText("掃描完畢!");pb_scan.setVisibility(View.INVISIBLE);break;}};}; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_clean_cache);//該類用來獲取緩存信息的pm = getPackageManager();tv_scan_result = (TextView) findViewById(R.id.tv_scan_result);pb_scan = (ProgressBar) findViewById(R.id.pb_scan);ll_container = (LinearLayout) findViewById(R.id.ll_container);// 掃描所有的應用程序,查看他們的緩存信息。scan();}private void scan() {new Thread() {public void run() {//從包管理者中獲取到所有已經安裝了的應用的包名集合List<PackageInfo> infos = pm.getInstalledPackages(0);//給進度條設置最大數pb_scan.setMax(infos.size());int progress = 0;for (PackageInfo info : infos) {//調用內部方法getCacheInfo(info);progress++;pb_scan.setProgress(progress);try {//模擬進度條運行耗時Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//遍歷已經安裝的應用安裝包,并讓UI中的TextView顯示遍歷的效果,所以使用HandlerMessage msg = Message.obtain();msg.what = SCANNING;//把應用的對象發過去msg.obj = info;handler.sendMessage(msg);}//遍歷完就給Handler發信號把UI中的TextView隱藏Message msg = Message.obtain();msg.what = FINISHED;handler.sendMessage(msg);};}.start();}//該方法里使用反射技術獲取緩存public void getCacheInfo(PackageInfo info) {try {Method method = PackageManager.class.getMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);method.invoke(pm, info.packageName, new MyObserver(info));} catch (Exception e) {e.printStackTrace();}}private class MyObserver extendsandroid.content.pm.IPackageStatsObserver.Stub {PackageInfo packinfo;public MyObserver(PackageInfo packinfo) {this.packinfo = packinfo;}@Overridepublic void onGetStatsCompleted(PackageStats pStats, boolean succeeded)throws RemoteException {// 這個方法不是運行在主線程中,所有不可以直接更新uilong size = pStats.cacheSize;System.out.println(packinfo.applicationInfo.loadLabel(pm)+ ",緩存大小為:"+ Formatter.formatFileSize(getApplicationContext(), size));}}}class CacheInfo {Drawable icon;String packname;String appname;long size; }


    能找到數據。那么就是在scan給界面更新。 功能完成后 技巧:動態在布局文件里,例如LinearLayout里加載類似于listView樣式的條目顯示

    我們需要把掃描到的信息條目怎么列在LinearLayout里?

    ll_container.addView(xxx);


    原因:

    使用Handler解決就沒問題了。 但是使用Message發送緩存信息發現比較多元化,所以定義一個緩存信息的bean內部類CacheInfo,讓MEssage發給handler去處理。 測試的結果樣式比較簡單,

    我們做的出專業些,定義一個條目布局:item_cacheinfo.xml

    item_cacheinfo.xml

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content" ><ImageViewandroid:id="@+id/iv_cache_icon"android:layout_width="40dip"android:layout_height="40dip"android:src="@drawable/ic_launcher" /><TextViewandroid:layout_centerVertical="true"android:layout_width="wrap_content"android:id="@+id/tv_cache_name"android:layout_height="wrap_content"android:layout_toRightOf="@id/iv_cache_icon"android:text="應用程序名稱"android:textColor="#000000"android:textSize="20sp" /><TextViewandroid:layout_centerVertical="true"android:layout_width="wrap_content"android:layout_alignParentRight="true"android:id="@+id/tv_cache_size"android:layout_height="wrap_content"android:text="緩存大小"android:textColor="#ff0000"android:textSize="14sp" /> </RelativeLayout>


    然后在CleanCacheActivity.java的Handler里使用打氣筒inflate把條目布局給加載進去,在為條目布局控件賦值,賦值之后讓linearLayout的對象ll_container.addView(view)添加進來。

    考慮到加載的條目比較多,我們在布局文件里再加上一個scrollBar控件,可以讓批量的條目支持滾動

    CleanCacheActivity.java

    public class CleanCacheActivity extends Activity {protected static final int SCANNING = 1;protected static final int FINISHED = 2;public static final int ADD_CACHE_VIEW = 3;private TextView tv_scan_result;private ProgressBar pb_scan;private LinearLayout ll_container;private PackageManager pm;private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case SCANNING://這樣可以讓子線程中遍歷的應用信息滾動PackageInfo info = (PackageInfo) msg.obj;tv_scan_result.setText("正在掃描:"+ info.applicationInfo.loadLabel(pm));break;case ADD_CACHE_VIEW:final CacheInfo cacheinfo = (CacheInfo) msg.obj;View view = View.inflate(getApplicationContext(),R.layout.item_cacheinfo, null);ImageView icon = (ImageView) view.findViewById(R.id.iv_cache_icon);TextView name = (TextView) view.findViewById(R.id.tv_cache_name);TextView size = (TextView) view.findViewById(R.id.tv_cache_size);icon.setImageDrawable(cacheinfo.icon);name.setText(cacheinfo.appname);size.setText(Formatter.formatFileSize(getApplicationContext(),cacheinfo.size));ll_container.addView(view);view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// pm.deleteApplicationCacheFiles(packageName,// mClearCacheObserver);try {Method method = PackageManager.class.getMethod("deleteApplicationCacheFiles",String.class, IPackageDataObserver.class);method.invoke(pm, cacheinfo.packname,new IPackageDataObserver.Stub() {@Overridepublic void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {}});} catch (Exception e) {e.printStackTrace();}}});break;case FINISHED://遍歷完應用接收到該信號就把UI中的TextView隱藏掉tv_scan_result.setText("掃描完畢!");pb_scan.setVisibility(View.INVISIBLE);break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_clean_cache);//該類用來獲取緩存信息的pm = getPackageManager();tv_scan_result = (TextView) findViewById(R.id.tv_scan_result);pb_scan = (ProgressBar) findViewById(R.id.pb_scan);ll_container = (LinearLayout) findViewById(R.id.ll_container);// 掃描所有的應用程序,查看他們的緩存信息。scan();}private void scan() {new Thread() {public void run() {//從包管理者中獲取到所有已經安裝了的應用的包名集合List<PackageInfo> infos = pm.getInstalledPackages(0);//給進度條設置最大數pb_scan.setMax(infos.size());int progress = 0;for (PackageInfo info : infos) {//調用內部方法getCacheInfo(info);progress++;pb_scan.setProgress(progress);try {//模擬進度條運行耗時Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//遍歷已經安裝的應用安裝包,并讓UI中的TextView顯示遍歷的效果,所以使用HandlerMessage msg = Message.obtain();msg.what = SCANNING;//把應用的對象發過去msg.obj = info;handler.sendMessage(msg);}//遍歷完就給Handler發信號把UI中的TextView隱藏Message msg = Message.obtain();msg.what = FINISHED;handler.sendMessage(msg);};}.start();}//該方法里使用反射技術獲取緩存public void getCacheInfo(PackageInfo info) {try {Method method = PackageManager.class.getMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);method.invoke(pm, info.packageName, new MyObserver(info));} catch (Exception e) {e.printStackTrace();}}private class MyObserver extendsandroid.content.pm.IPackageStatsObserver.Stub {PackageInfo packinfo;public MyObserver(PackageInfo packinfo) {this.packinfo = packinfo;}@Overridepublic void onGetStatsCompleted(PackageStats pStats, boolean succeeded)throws RemoteException {// 這個方法不是運行在主線程中,所有不可以直接更新uilong size = pStats.cacheSize;System.out.println(packinfo.applicationInfo.loadLabel(pm)+ ",緩存大小為:"+ Formatter.formatFileSize(getApplicationContext(), size));if (size > 0) {//在該遠程服務實現類里進行對緩存的數據處理,使用把數據通過Message發給Handler然后處理UIMessage msg = Message.obtain();msg.what = ADD_CACHE_VIEW;CacheInfo cacheinfo = new CacheInfo();cacheinfo.icon = packinfo.applicationInfo.loadIcon(pm);cacheinfo.packname = packinfo.packageName;cacheinfo.appname = packinfo.applicationInfo.loadLabel(pm).toString();cacheinfo.size = size;msg.obj = cacheinfo;handler.sendMessage(msg);}}}class CacheInfo {Drawable icon;String packname;String appname;long size;}/*** 清理全部的緩存* @param view*/public void cleanAll(View view){Method[] methods= PackageManager.class.getMethods();for(Method method : methods){if("freeStorageAndNotify".equals(method.getName())){try {method.invoke(pm, Integer.MAX_VALUE,new IPackageDataObserver.Stub() {@Overridepublic void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {System.out.println("result:"+succeeded);}});} catch (Exception e) {e.printStackTrace();}return;}}}}

    課6

    實現清理緩存信息(建議下午的觀察源碼的流程視頻看一遍)

    接著清理緩存信息 需求:模仿金山:跳轉到設置中心的app設置中心 需求2:模仿騰訊:


    找源碼,實現清除緩存的點擊功能

    我們給條目設計一個點擊事件,把以上的源碼設計進來。 然后發現方法有不能直接調用,被谷歌工程師給隱藏了,所以又需要反射出來:?

    CleanCacheActivity.java

    view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// pm.deleteApplicationCacheFiles(packageName,// mClearCacheObserver);try {Method method = PackageManager.class.getMethod("deleteApplicationCacheFiles",String.class, IPackageDataObserver.class);method.invoke(pm, cacheinfo.packname,new IPackageDataObserver.Stub() {@Overridepublic void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {}});} catch (Exception e) {e.printStackTrace();}}});

    然后點擊發現又報出異常信息:?


    但是在加載權限是發現清單文件也報錯了?

    那么我們強行刪除Problems中的信息,看是否可以運行。 發現不可行:那么按照之前的邏輯去反射谷歌隱藏的方法來實現功能不可行,那么有什么辦法清理應用緩存呢?

    但是清理緩存的功能還是能實現的,那就是一鍵清理的安卓漏洞。

    主要是安卓的一個服務會檢測系統的內存,如果發現內存不足,那么會自動把系統里的所有緩存給刪除,我們可以抓住此漏洞,模仿該特點去發送內存不足的信息給系統,一次達到一鍵清理緩存的功能實現。 在CleanCacheActivity里加入一鍵清理的功能cleanAll PackageManager-->freeStorageAndNotify

    CleanCacheActivity.java

    /*** 清理全部的緩存* @param view*/ public void cleanAll(View view){Method[] methods= PackageManager.class.getMethods();for(Method method : methods){if("freeStorageAndNotify".equals(method.getName())){try {method.invoke(pm, Integer.MAX_VALUE,new IPackageDataObserver.Stub() {@Overridepublic void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {System.out.println("result:"+succeeded);}});} catch (Exception e) {e.printStackTrace();}return;}} }

    源碼解釋:?

    使用反射來調用該方法。一次給系統發送信息。 點擊一鍵清理

    雖然報出異常: 但是其實都已經刪除了 金山的SD卡清理


    怎么實現?

    SD卡不安全,每個應用程序都會在SD卡里寫一些內容,這些內容我們不可能去手工認知,但是金山已經把他們寫成數據庫文件了,我們就使用金山的數據庫來遍歷SD卡是否有一樣的文件,以此來找到并刪除。 金山的痕跡清理


    沒什么好說的,呵呵

    資料下載

    總結

    以上是生活随笔為你收集整理的手机卫士-11的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩免费视频线观看 | 国产午夜精品视频 | 日韩欧美电影在线 | 久久99热精品这里久久精品 | 亚洲专区中文字幕 | 天天干天天做天天爱 | 久久在线 | 亚洲91网站 | 欧美日韩国产二区三区 | 一区二区三区免费在线播放 | 96国产精品视频 | 日韩av电影网站在线观看 | 69国产在线观看 | 免费观看久久 | 久久 在线 | 黄色特级毛片 | 天天干,天天插 | 99在线免费视频观看 | 国产中文字幕在线视频 | 麻豆视频一区二区 | 99久久久成人国产精品 | 99麻豆视频 | 亚洲午夜精品久久久久久久久久久久 | 91av视频网 | 开心激情五月网 | www.亚洲黄色 | 五月天丁香亚洲 | www.色婷婷 | 亚洲午夜精品在线观看 | 国产精品成人av在线 | 久久人人爽人人爽 | 色a综合 | 六月色丁 | 久久久久国产精品免费 | 日韩精品免费在线观看视频 | 国产精品久久中文字幕 | 国产免费黄视频在线观看 | 国产在线免费av | 美女黄频在线观看 | 国产精品婷婷 | 日韩av不卡在线播放 | 久久国产欧美日韩 | 欧美日一级片 | 亚洲精品字幕 | 69国产精品成人在线播放 | 久久国产色| 日本久久久久久 | 国产精品久久久久久一二三四五 | 精品综合久久久 | 国产黄色高清 | 国产91精品一区二区 | 日韩av网页 | 日本久久久久久久久久久 | 国产精品 999 | 亚洲一区二区视频在线播放 | 欧美综合在线视频 | 国产精品网红直播 | 九九精品毛片 | 国产精品自在线拍国产 | 婷婷精品在线视频 | 成人a在线观看高清电影 | 亚洲欧洲成人精品av97 | 麻豆视频免费入口 | 精品视频免费播放 | 日韩电影一区二区在线观看 | 久热电影 | 四虎影视国产精品免费久久 | 免费看的av片 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久草免费福利在线观看 | 久久久免费精品视频 | 99精品欧美一区二区蜜桃免费 | 国产亚洲精品久久19p | 日韩av中文在线观看 | 六月丁香色婷婷 | 91麻豆.com| 91亚洲欧美 | 欧美精品一区二区在线观看 | 国产成人福利 | www..com黄色片 | 国产91免费在线观看 | 91成品人影院 | 国产中文字幕一区 | 国产精品剧情 | 国产91探花 | 99视频在线精品免费观看2 | 久久国内精品视频 | 激情xxxx| 免费观看av| 人人舔人人爱 | 国产精品video爽爽爽爽 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 丁香九月婷婷综合 | 国产自产高清不卡 | 在线观看免费一区 | 欧美在线视频精品 | 美女av免费看 | 久久综合精品国产一区二区三区 | 亚洲在线免费视频 | 亚洲国产成人精品在线 | 久久久久国产一区二区三区四区 | 国产无套精品久久久久久 | 中文字幕亚洲综合久久五月天色无吗'' | 欧美精品国产精品 | 国产99区 | 狠狠狠干狠狠 | 五月婷婷久草 | 视频在线观看国产 | av中文字幕在线免费观看 | 999电影免费在线观看 | 成人一区不卡 | 欧美三级高清 | 91成人在线看 | 91丨九色丨高潮丰满 | 国产一区二区成人 | 丁香花在线视频观看免费 | 嫩嫩影院理论片 | 精品视频中文字幕 | 91av影视| 伊人导航 | 黄色小说网站在线 | 亚洲成人黄色av | av九九| 天天干天天操av | aa一级片 | 色噜噜日韩精品一区二区三区视频 | 国产手机av | 久久久免费高清视频 | 久久久久久久久久久网站 | 国产精品一区二区中文字幕 | 欧美乱淫视频 | 九九九在线观看视频 | 欧美夫妻生活视频 | 97视频免费 | 九九精品久久 | 亚洲黄网站 | 欧美 日韩 视频 | 成人黄色免费在线观看 | 午夜久久网站 | 五月婷婷久草 | 一区二区三区不卡在线 | 欧美日韩一区二区三区不卡 | 国产专区日韩专区 | 91高清完整版在线观看 | 国产中文字幕免费 | 日本久久久影视 | 狠狠综合久久 | 国产九九九视频 | 国产一级做a爱片久久毛片a | 国产一区二区久久久久 | 亚洲六月丁香色婷婷综合久久 | 日韩综合一区二区 | 中文字幕在线久一本久 | 免费看片网址 | 国产 一区二区三区 在线 | 鲁一鲁影院 | 久久在线影院 | 成人黄色电影视频 | 一区二区精 | 欧美999| 免费看三级 | 免费男女羞羞的视频网站中文字幕 | 91黄色成人 | 亚洲精选99| 成人毛片一区 | 揉bbb玩bbb少妇bbb | 日韩综合精品 | 精品久久国产一区 | 国产亚洲成av人片在线观看桃 | 亚洲欧美精品一区 | 天天激情在线 | 激情五月色播五月 | a久久久久 | 国产成人性色生活片 | 九九久久影院 | 亚洲精品乱码久久久久 | 最近日本mv字幕免费观看 | 日韩在线观看一区二区 | 国产精品视频久久 | 国产不卡视频在线播放 | 国产一区二区成人 | 精品久久一区二区三区 | 日韩深夜在线观看 | 麻豆视频在线免费观看 | 日韩亚洲在线观看 | 99色视频在线 | 日韩av一区二区在线 | 精品不卡av | 在线亚洲人成电影网站色www | 日日干美女 | 91丨九色丨91啦蝌蚪老版 | 成人av一区二区兰花在线播放 | 在线亚洲小视频 | 色狠狠久久av五月综合 | 99久久国产免费,99久久国产免费大片 | 日韩三级视频在线观看 | 91超级碰| 青青河边草观看完整版高清 | av一区二区三区在线 | 最近更新好看的中文字幕 | 性色av一区二区三区在线观看 | 日韩免费福利 | 五月在线视频 | 天天操月月操 | 国产高清不卡在线 | 日日摸日日爽 | 欧美综合色| 天天天综合网 | 麻豆一精品传二传媒短视频 | 91精品成人久久 | 四虎国产永久在线精品 | 亚洲最新av在线网站 | 亚洲区另类春色综合小说 | 激情久久网 | 国产最顶级的黄色片在线免费观看 | 六月婷操 | 免费情缘 | 日韩av在线影视 | 国产精品毛片久久蜜 | www.天天射 | 国产日韩精品在线观看 | 国产在线黄色 | 日韩午夜小视频 | 夜夜爽88888免费视频4848 | 91热爆在线观看 | 久草国产在线观看 | 亚洲精品中文字幕视频 | 国产 一区二区三区 在线 | 色九九视频| 日韩三级免费 | 三上悠亚一区二区在线观看 | 午夜精品一区二区三区在线播放 | 日韩精品免费一线在线观看 | 中国美女一级看片 | 国产乱老熟视频网88av | 三级黄色三级 | 欧美最新另类人妖 | 免费在线观看毛片网站 | 97视频免费在线 | 一区二区三区免费在线观看 | 色婷婷在线观看视频 | 国产黄色一级片 | 精品久久久久久综合日本 | 韩国一区二区在线观看 | 久久久久久蜜桃一区二区 | 很黄很黄的网站免费的 | 99久久久久国产精品免费 | 丁香激情五月 | 精品日韩在线一区 | 视频在线观看99 | 亚洲成aⅴ人片久久青草影院 | 国产手机在线精品 | 精品国产伦一区二区三区观看方式 | 天天草天天干天天射 | 国产不卡毛片 | 国产一区二区日本 | 成年人在线播放视频 | 国产精品入口a级 | 婷婷国产精品 | 五月婷婷开心中文字幕 | 少妇18xxxx性xxxx片 | 亚洲色影爱久久精品 | 精品999| 精品久久久久久国产偷窥 | 亚洲美女视频网 | 亚洲国产午夜视频 | 狠狠88综合久久久久综合网 | 久草在线这里只有精品 | 91人人网| 在线免费黄色毛片 | 又色又爽的网站 | 91爱爱中文字幕 | x99av成人免费 | 日日干网址 | 中文字幕丰满人伦在线 | 日日色综合 | 久草在线视频新 | 伊人精品影院 | 超碰97人人干 | 99精品国产免费久久 | 最新在线你懂的 | 夜夜夜夜爽 | 亚洲国产成人av网 | 五月婷婷中文网 | 黄色精品一区二区 | 国产精品乱看 | 日本性生活一级片 | 日韩va欧美va亚洲va久久 | 一区二区不卡在线观看 | 国产精品97 | 亚洲91在线 | 国产精品福利在线播放 | 久草网在线观看 | av最新资源 | 亚洲va韩国va欧美va精四季 | 在线看的av网站 | 欧美日韩免费观看一区=区三区 | 婷婷深爱五月 | 日本中文字幕影院 | 天天操,夜夜操 | 日韩高清黄色 | 在线视频欧美精品 | 国产五月色婷婷六月丁香视频 | 九九九九热精品免费视频点播观看 | 天天射天天射天天射 | 国产一级片在线播放 | 欧美国产日韩在线观看 | 日韩中文字幕免费电影 | 午夜精品一区二区三区视频免费看 | 日韩在线观看视频一区二区三区 | 欧美激情精品久久久久久 | 免费黄色一区 | 日韩激情三级 | 丁香在线观看完整电影视频 | 国产精品毛片久久 | 亚洲成人av在线播放 | 粉嫩一区二区三区粉嫩91 | 亚州天堂 | 免费精品人在线二线三线 | 亚洲欧美综合 | 9999亚洲| 欧美aaa大片| 欧美激情综合五月色丁香 | 激情婷婷六月 | 国产手机视频 | 日韩成人免费在线电影 | 视频国产区 | 97国产视频 | 好看的国产精品视频 | 午夜在线免费观看 | av免费看看| 久久久久久看片 | 国产探花视频在线播放 | 一区二区日韩av | 全黄网站| 亚洲精品一区中文字幕乱码 | 福利电影一区二区 | 日韩激情视频在线观看 | 婷婷社区五月天 | 中文字幕日韩有码 | 91久久爱热色涩涩 | 日韩在线观看视频免费 | 国产免费国产 | 五月天久久久久 | 最新av网址在线观看 | 国产亚洲在线 | 在线观看视频在线 | 色天天综合久久久久综合片 | 又爽又黄又无遮挡网站动态图 | 国产日韩欧美在线播放 | av性网站 | 免费在线a| 日本中文字幕一二区观 | 久久久影院一区二区三区 | 天堂av免费 | 三级视频片 | 丁香婷婷激情 | 久久成人18免费网站 | 欧美人人 | 久久黄色成人 | 日韩精品久久久久久久电影99爱 | 久久99热这里只有精品国产 | 久久99国产综合精品 | 99久久精品久久亚洲精品 | 亚洲精品国产高清 | 国内视频在线 | 国产成人av福利 | 2020天天干夜夜爽 | 色综合激情网 | 韩国av三级 | 午夜在线观看一区 | 亚洲综合精品在线 | 人人搞人人爽 | 色多多视频在线观看 | 黄色免费看片网站 | 亚洲成人国产 | 国际av在线 | 97成人在线观看 | 美女在线免费视频 | 国产高清在线观看 | 狠狠干干| 国产日韩欧美自拍 | 婷色在线| www.五月天激情 | 精品久久久久久久久中文字幕 | 一级片视频免费观看 | 亚洲永久精品在线 | 亚洲区色 | 91成年人在线观看 | 激情综合网婷婷 | 在线亚洲高清视频 | 美女免费黄视频网站 | 91精品网站 | 欧美在线观看视频一区二区 | 日日草天天干 | 国产精品视频app | 免费看黄色毛片 | 久久久免费国产 | 在线亚洲小视频 | 日韩欧美一区二区在线 | 欧美一区二区在线免费观看 | 国产一区二区三区 在线 | 国产一级二级三级视频 | 91人人爽久久涩噜噜噜 | 国产黑丝袜在线 | 午夜av片| 麻花豆传媒一二三产区 | 麻豆视频国产在线观看 | 婷久久 | 日韩欧美视频一区 | 国产中文字幕网 | 免费看色网站 | 西西人体4444www高清视频 | 国产不卡在线观看视频 | 超碰97网站 | 91精品视频免费看 | 久久不射电影院 | 国产精品99久久久久 | 免费a v网站 | 可以免费观看的av片 | 日韩成人高清在线 | 亚洲精品久久久久中文字幕二区 | 亚洲 综合 专区 | 天天艹日日干 | 日韩精品久久久久久中文字幕8 | 久久综合久久综合这里只有精品 | 色亚洲网 | 久久香蕉国产精品麻豆粉嫩av | 一区二区三区在线播放 | 99久久精品国产一区 | 国产精品成人一区二区 | 久久精品91视频 | 草久在线观看 | 国产黄大片| 精品久久91 | 91网页版免费观看 | 麻豆91精品| 天天做夜夜做 | 91av视频在线播放 | 丁香婷婷综合色啪 | 久久99久久久久 | 就要色综合 | 日日夜夜骑 | 久久艹综合 | 久久久久久久久久久黄色 | 久久久久久久久久电影 | 在线亚洲欧美视频 | 久久国产精品一区二区三区 | 国产一区视频在线观看免费 | 亚洲日韩中文字幕 | 日韩久久精品一区二区三区下载 | 手机看片久久 | 亚洲专区免费观看 | 亚洲精品在线一区二区三区 | 亚洲欧洲一区二区在线观看 | 激情av网址 | 99精品在线免费在线观看 | 亚洲高清免费在线 | 欧美日韩高清一区二区 | 国产精品扒开做爽爽的视频 | 日韩久久久久久久 | 国产精品黄网站在线观看 | 99久久99视频只有精品 | 久久久福利视频 | 色综合久久88色综合天天 | 一区二区三区中文字幕在线 | 欧美日本不卡 | 亚洲视频在线观看 | 毛片永久免费 | 欧美激情视频在线观看免费 | 国产成人久久精品亚洲 | 99久久精品视频免费 | 色婷婷综合久色 | 欧美天堂久久 | 天天曰| 欧美日韩精品在线一区二区 | 97超碰福利久久精品 | 中文字幕免费在线 | 日韩中文字幕91 | 久久久久一区二区三区四区 | 久久免费国产 | 国产精品私拍 | 久久国语露脸国产精品电影 | 国产精品一区在线观看 | 97超碰人人模人人人爽人人爱 | 亚洲成人av电影在线 | 手机av电影在线观看 | 深夜视频久久 | 日韩一级理论片 | 国产成人在线网站 | a级片韩国| 91成人在线视频 | 国产精品尤物 | 久久成人综合视频 | 成人免费中文字幕 | 男女全黄一级一级高潮免费看 | 欧美日韩在线网站 | 日韩高清在线一区二区 | 亚洲激情中文 | 欧美国产视频在线 | 日韩在线观看精品 | 亚洲欧洲精品视频 | 色网免费观看 | 久久免费视频在线观看 | 国产视频精品久久 | 天天天色综合 | 天天干天天做天天操 | 一二三区高清 | 91人人澡人人爽人人精品 | 亚洲一区久久久 | 日本亚洲国产 | 2020天天干夜夜爽 | 天天色天天爱天天射综合 | av电影 一区二区 | 久久精品高清视频 | 丁香六月天 | 国产123区在线观看 国产精品麻豆91 | 国产成人精品一区二区三区免费 | 在线看片91 | 久草在线看片 | 欧美一级免费 | 亚洲香蕉视频 | 日韩午夜电影院 | 在线观看www视频 | 99免费在线视频 | 久久久国产精品电影 | 日韩高清久久 | 91资源在线视频 | 天堂av免费 | 又色又爽又激情的59视频 | 久久久国产精品人人片99精片欧美一 | 日本久久久精品视频 | 狠狠干成人综合网 | 国产精品都在这里 | 久久亚洲婷婷 | 97自拍超碰 | 国产一级片免费视频 | 欧美日本一二三 | 免费观看一级视频 | 亚洲美女免费视频 | 很黄很色很污的网站 | 免费三级大片 | 国产色综合 | 丁香婷婷激情啪啪 | 久久综合免费视频影院 | 国产免费大片 | 国产一区二区视频在线 | 日韩精品中文字幕有码 | 成人av在线资源 | 久久成视频 | 精品色999 | 国产九色视频在线观看 | 久艹在线观看视频 | 免费大片黄在线 | 中文字幕在线观看1 | 精品国产区在线 | 狠狠干婷婷 | 亚洲人成免费网站 | 国产成人精品一区二区三区福利 | 日韩av免费大片 | 色婷婷激情五月 | 国产精品18p | 日日夜夜精品网站 | 欧美性春潮 | 中文字幕乱码电影 | 日韩素人在线观看 | 国产精品久久久久久久久久久久午夜 | 午夜久久成人 | 国产精品一区二区免费在线观看 | 久久av免费电影 | 国产在线播放一区二区三区 | www久草 | av字幕在线| 最近2019年日本中文免费字幕 | 日韩免费高清在线观看 | 国产精品久久久久久久久久久久午夜 | 久久艹综合 | 国产精品成人在线观看 | av片无限看| 丁香花中文在线免费观看 | 欧美精品久久天天躁 | 在线播放你懂 | 日韩精品一区二区在线观看视频 | 亚洲成熟女人毛片在线 | 蜜桃麻豆www久久囤产精品 | 毛片在线播放网址 | 精品一区二区在线免费观看 | 在线小视频| 91传媒激情理伦片 | 亚洲va男人天堂 | 91精品久久久久 | 99精品免费久久久久久久久 | 色噜噜在线观看视频 | 免费高清在线观看成人 | 97视频免费在线观看 | 亚洲激精日韩激精欧美精品 | 又爽又黄又无遮挡网站动态图 | 美女黄频在线观看 | 五月天综合 | 久久久在线视频 | 亚洲蜜桃在线 | 国产精品九九九九九 | 久草视频在线观 | 久久精品免费观看 | 国产又粗又硬又爽的视频 | 91激情在线视频 | 精品乱码一区二区三四区 | 国产一区二区三区高清播放 | 九九视频免费在线观看 | 免费观看www小视频的软件 | 亚洲激情综合网 | 玖玖精品在线 | 国产99一区视频免费 | 国产精品一区二区麻豆 | 国产精品免费不 | 久久66热这里只有精品 | 操操操综合 | 欧美精品黑人性xxxx | 日韩69视频 | 九色精品免费永久在线 | 国产成人精品午夜在线播放 | 美女免费黄视频网站 | 人人干人人超 | 久草久热 | 国产一级免费播放 | 九九免费在线观看视频 | 色综合天天天天做夜夜夜夜做 | 在线视频 一区二区 | 国产精品免费不卡 | 亚洲深夜影院 | 久久久蜜桃一区二区 | 中文字幕在线观看第一区 | 国产精品国产自产拍高清av | 欧美日本一区 | 波多野结衣在线观看一区二区三区 | 久二影院 | 中文字幕视频一区二区 | 日韩av成人在线观看 | 丁香婷五月 | 久久伊人精品一区二区三区 | 日韩城人在线 | 日韩欧美精品在线观看 | 欧美极度另类性三渗透 | 深爱婷婷久久综合 | 久久久久在线观看 | 91视频高清免费 | 一区二区三区在线观看免费 | 国内偷拍精品视频 | 2023天天干 | 一区二区三区在线免费播放 | 免费看一级特黄a大片 | 久久久久久看片 | 超碰人人做 | 午夜私人影院 | 天天曰天天射 | 日韩色一区二区三区 | 五月天天在线 | 久久久久国产精品午夜一区 | 欧美日本一区 | 久久视频在线看 | 天天干天天弄 | 日韩三级一区 | 天天草天天干天天 | 黄色在线观看污 | 丁香花在线视频观看免费 | 欧美男男激情videos | 97在线看| 香蕉视频色 | 日本电影黄色 | 91在线小视频 | 激情久久婷婷 | 国产精品视频999 | 日韩成人免费观看 | 99在线视频观看 | 亚洲 欧洲av | 国产成人久久精品一区二区三区 | 日韩亚洲在线观看 | 91精品人成在线观看 | 成人一区二区三区中文字幕 | 中文字幕在线观看2018 | 国色天香在线 | 在线视频日韩精品 | 久久综合色婷婷 | 久久久香蕉视频 | 亚洲专区在线播放 | 四虎影视成人永久免费观看视频 | 亚洲成人中文在线 | 成人免费xyz网站 | 福利一区在线 | 在线国产片 | 永久免费毛片在线观看 | 日韩精品观看 | 欧美午夜久久 | 日韩av中文在线观看 | 亚洲尺码电影av久久 | 国产一级大片在线观看 | 欧美伦理电影一区二区 | 国产精品嫩草影院9 | 国产精品久久久久一区二区三区共 | 99视频精品全国免费 | 日日操天天操夜夜操 | 国产精品一区二区久久国产 | 在线观看一 | 久久久精品午夜 | 九色91在线视频 | 日韩欧美网站 | 91色网址 | 麻豆影视网 | 97视频在线观看网址 | 91精品福利在线 | 亚洲国产日韩av | 黄色精品国产 | 国产精品视频观看 | 久草剧场 | 欧美大片第1页 | 97视频在线免费 | 欧美日韩视频在线观看一区二区 | 日本久久久久久久久 | 日韩在线免费高清视频 | 久久国产精品电影 | 亚洲日韩欧美一区二区在线 | 欧美日产在线观看 | 69精品| 国产高清不卡一区二区三区 | www.大网伊人 | 免费午夜在线视频 | 国产精品免费小视频 | 久久免费国产精品1 | 久久精彩免费视频 | 国产精品在线看 | 久久国产精品第一页 | 在线观看黄色免费视频 | 日韩在线一级 | 国产色秀视频 | 国产成人久 | 91av观看 | www.黄色 | 三上悠亚在线免费 | 欧美日韩成人一区 | 久久99久久精品国产 | 亚洲国产中文字幕在线视频综合 | 69久久99精品久久久久婷婷 | 国内精品久久久久影院一蜜桃 | 亚洲精品免费在线观看视频 | 久久爱影视i | 欧美另类交人妖 | 三级性生活视频 | 天天插综合网 | 婷婷深爱 | 亚洲高清视频一区二区三区 | 人人舔人人爽 | 久久99精品国产91久久来源 | 天天草综合 | 亚洲精品中文字幕视频 | 日韩va欧美va亚洲va久久 | 黄色一及电影 | 一区二区三区在线观看免费 | bbbbb女女女女女bbbbb国产 | 麻豆视频在线观看免费 | 91国内在线 | 久草在线播放视频 | 夜夜躁狠狠躁 | 热久久视久久精品18亚洲精品 | 久久久久久久久久久免费 | 欧美一区二区三区四区夜夜大片 | 玖玖爱在线观看 | 97超碰人人澡| 国产又粗又硬又爽的视频 | 欧美精品一区二区在线播放 | 制服丝袜一区二区 | 天天草天天干天天射 | 成人资源在线播放 | 午夜精品久久久久久久久久久久久久 | 日本精品一区二区三区在线观看 | 国产亚洲观看 | 视频国产精品 | 日韩在线视频国产 | 五月婷色| 1024在线看片 | 最新av免费在线观看 | 九九久久免费视频 | 国产高清 不卡 | 久久99久久99精品免视看婷婷 | 午夜精品一区二区三区免费视频 | 欧美激情视频久久 | 精品免费99久久 | 亚洲精品在线一区二区三区 | 91传媒激情理伦片 | 欧美一级电影免费观看 | 极品久久久 | 久久久久婷 | 精品在线免费视频 | 亚洲国产免费网站 | 一区二区三区不卡在线 | 久久久久成人精品免费播放动漫 | 国产美女视频一区 | 特黄特色特刺激视频免费播放 | 一本一本久久a久久精品综合 | 久草在线在线视频 | 婷婷av色综合| 久久久久久97三级 | 久久99在线观看 | 国产精品久久中文字幕 | 在线观看精品黄av片免费 | 四虎在线观看网址 | 免费视频成人 | 2019中文在线观看 | 精品国产欧美一区二区 | 国产一级片在线播放 | 久久精品久久精品久久 | 欧美成人一区二区 | 日韩av影片在线观看 | 日日干视频 | 日本黄区免费视频观看 | 欧美一级片免费观看 | 五月天激情视频在线观看 | 成年人免费在线观看 | 国产成人99久久亚洲综合精品 | 久久久久国产一区二区 | 二区三区av | 婷婷射五月 | 欧美乱码精品一区 | 成人污视频在线观看 | 久久久精品福利视频 | 香蕉视频啪啪 | 国产精品视频不卡 | 中文字幕日韩国产 | 成人在线播放免费观看 | 色香com.| 国产高清成人在线 | 欧洲精品码一区二区三区免费看 | 高潮久久久久久久久 | 成人午夜在线观看 | 中文字幕在线观看日本 | www.黄色 | 久久色在线观看 | 亚洲综合黄色 | 色激情在线 | 91看片一区二区三区 | 97精品欧美91久久久久久 | 一区二区视频在线播放 | 久久影院中文字幕 | 国产精品免费不卡 | 亚洲成免费 | 91在线视频观看 | av成人在线电影 | 五月天亚洲激情 | 91av中文| 日韩精品一区二区三区中文字幕 | 久久96国产精品久久99软件 | 欧美日韩中文国产 | 日韩激情免费视频 | 亚洲一级片免费观看 | 国产亚洲视频在线 | 亚洲视屏在线播放 | 国产裸体bbb视频 | 欧美精品天堂 | 18久久久久| 免费福利视频导航 | 久久视频精品在线观看 | 国产精品久久久久久久久久 | 成人在线视频观看 | 成人av免费电影 | 九色视频网 | 久久久久综合视频 | 色在线最新 | 一级片视频在线 | 国产美女永久免费 | 999在线观看视频 | 午夜三级福利 | 在线观看一区视频 | 97爱爱爱 | 国产精品美女久久久久久免费 | 日韩高清av | 久久少妇免费视频 | 一区二区三区在线不卡 | 亚洲人成影院在线 | 日韩视频a | 亚洲精品国产精品国自产在线 | 97精品久久人人爽人人爽 | 超碰免费av | 免费观看性生交 | 日韩字幕 | 天天操福利视频 | 国产精品一区在线播放 | 天天爱天天操天天爽 | 成人一区二区三区中文字幕 | 五月开心综合 | 成人一级电影在线观看 | 韩国三级一区 | 亚洲精品乱码白浆高清久久久久久 | 91九色在线播放 | 高清久久久 | 国产精品一区二区免费视频 | 2019精品手机国产品在线 | 91久久国产露脸精品国产闺蜜 | 国产韩国日本高清视频 | 久久艹免费 | 亚洲,播放 | 国产成人av免费在线观看 | 天天操天天干天天操天天干 | av片子在线观看 | 久久免费黄色网址 | 热久久免费视频精品 | 亚洲国产午夜视频 | 欧美日韩视频免费 | 成人在线视频免费观看 | 中国一区二区视频 | 精品久久久99 | 久久这里有精品 | 精品av在线播放 | 九月婷婷综合网 | 丁香婷婷综合色啪 | 又色又爽又黄 | 日韩精品资源 | 婷婷丁香社区 | 久久a久久 | 免费看亚洲毛片 | 亚洲国产日韩欧美 | 免费在线观看一区 | 91色视频| 久久精品牌麻豆国产大山 | 日韩欧美一区二区三区在线观看 | 狠狠干 狠狠操 | 亚洲黄色网络 | 久久成人午夜视频 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 在线导航福利 | 久久激情小视频 | 99在线热播精品免费 | 欧美精品一区二区三区一线天视频 | a级国产乱理论片在线观看 伊人宗合网 | 视频在线一区二区三区 | 伊人首页 | 亚洲国产精品影院 | 精品国产综合区久久久久久 | 欧美日韩国产一区二区在线观看 | 国产精品毛片久久久 | 探花视频在线观看免费版 | 国产色久| 精品视频在线视频 | 一区二区三区中文字幕在线 | 久久黄页 | 黄色在线看网站 | 操操操干干干 | 99在线精品视频在线观看 | 高清视频一区二区三区 | 国产在线观看高清视频 | 亚洲国产精品成人va在线观看 | 午夜影院一级片 | 色诱亚洲精品久久久久久 | 在线中文字幕av观看 | 久久亚洲国产精品 | 伊甸园av在线 | 美女天天操| 少妇bbbb搡bbbb桶 | 国产无套精品久久久久久 | 韩国中文三级 | 国产成人av片 | 亚洲成人二区 | 99久久www免费| 97久久精品午夜一区二区 | 香蕉视频久久久 | 天天做日日做天天爽视频免费 | 亚洲人在线 | 亚洲欧美日韩国产精品一区午夜 | 97av超碰 | 黄色精品免费 | 偷拍精偷拍精品欧洲亚洲网站 | 日韩欧美一区二区在线 | 婷婷综合影院 | 久久黄色小说 | 亚洲国产大片 | 一区二区三区电影 | 草 免费视频| 日韩精品一区二区三区在线视频 | 中文字幕欲求不满 | 国产色一区 | 婷婷色站| 日韩精品视频免费专区在线播放 | 久精品视频免费观看2 | 99久久婷婷国产综合精品 | 精品视频免费在线 | www.操.com| 中文字幕亚洲欧美 | 免费亚洲婷婷 | 草久久精品| 97影视| 999久久久久 | 国产破处在线播放 | 色噜噜日韩精品一区二区三区视频 | 黄色片网站| 欧美一区二区免费在线观看 | 欧美性性网 | 天天操天| 欧美va天堂va视频va在线 | 国产精华国产精品 | 成人性生交大片免费看中文网站 |