去广告APP学习笔记1

原创
2015/05/16 22:19
阅读数 112

#去广告APP学习笔记1

目的是分析APP结构和各个部分的作用

##APP结构

###Settings.java

public class Settings extends SherlockFragmentActivity {}

public class SherlockFragmentActivity extends Watson implements OnActionModeStartedListener, OnActionModeFinishedListener {}

####SherlockFragmentActivity 的作用

关于碎片里面ActionBar的初始化,实现ActionMode的开始和结束。

实现Sherlock这个ActionBar的生命周期的设置,在watson里实现了Sherlock menu 的 handling,包括点击事件的处理和菜单的维护

####Settings 的作用

1.从UI设置里获取了一个轻量级存储类ui_preference,存入uiPref中,并根据uiPref里的值设置主题

public void onCreate(Bundle savedInstanceState) {
        
	    uiPref = getSharedPreferences("ui_preference", MODE_PRIVATE);
	    boolean themeDark = uiPref.getBoolean("theme_dark", false);
	    if(themeDark) {
	        setTheme(R.style.MinMinTheme);
	    }													
		super.onCreate(savedInstanceState);

2.调用了LogFragment中的消息处理器handler

pref = getSharedPreferences(getPackageName() + "_preferences", MODE_WORLD_READABLE);
LogFragment.mHandler = new Handler();
        

插入LogFragment的解析

###LogFragment.java

LogFragment初始化了一个SherlockFragment,在其中维护了一个后台运行的线程

public class LogFragment extends SherlockFragment {
    static public Handler mHandler;
    public void refresh() {
        tvLog.setText("");
        tvLog.append("Log\n");
        tvLog.append("===========\n");
        
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                
                List<String> progs = new ArrayList<String>();
                Context context = getActivity();
                final String pname = "tw.fatminmin.xposed.minminguard";
                
                //检查READ_LOGS权限是否获取
                if (context.getPackageManager().checkPermission(android.Manifest.permission.READ_LOGS, pname) != 0) {
                    if (android.os.Build.VERSION.SDK_INT >= 16) {
                        progs.add("su");
                        progs.add("-c");
                        progs.add("pm grant tw.fatminmin.xposed.minminguard android.permission.READ_LOGS");
                        
                        //在这个APP的运行环境里开一个进程执行上面添加的指令代码
                        try {
                            Process proc = Runtime.getRuntime().exec(progs.toArray(new String[progs.size()]));
                            proc.waitFor();
                        }
                        catch (Exception e) {
                            e.printStackTrace();
                            return;
                        }
                    }
                }
                                

APP在这个线程中向安卓系统获取了READ_LOGS的权限

progs.clear();
                progs.add("logcat");
                
                //获取日志
                progs.add("-d");    
                
                //设置默认过滤器
                progs.add("-s");
                
                //设置过滤器内容
                progs.add(Util.tag);    //tag 的内容为SafeGuard
                
                //执行指令
                try {
                    Process proc = Runtime.getRuntime().exec(progs.toArray(new String[progs.size()]));
                    
                    //构造BufferedReader,使它从InputStreamReader中读取1024个字节的数据
                    BufferedReader bufferedReader = new BufferedReader(
                    
                            //从进程proc中获取输入流,绑定到InputStreamReader上
                            new InputStreamReader(proc.getInputStream()), 1024);
                            
                    String line; 
                    
                    //从BufferedReader里逐行读取,直到将BufferedReader读空
                    while ((line = bufferedReader.readLine())!= null) {   
                        
                        if(line.contains("beginning of /dev/log")) {
                            continue;
                        }
                        
                        final String msg = line;
                        
                        //发送一个可执行对象到线程,执行:在textView tvlog中打印line
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                tvLog.append(msg);   
                                tvLog.append("\n");
                            }
                        });
                    }
                    
                    bufferedReader.close();
                    proc.destroy();
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            tvLog.append("===========\nEnd of log");
                        }
                    });
                    
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

LogFragment的主要作用是打印

PrefsFragment的作用是实现搜索,刷新APP列表的模块

public class PrefsFragment extends SherlockFragment {
    
    static public ListView listView;
    
    private CheckBoxAdapter mAdapter;
    private EditText search;
    private List<Map<String, Object>> itemList;
    
    public void refresh() {
        setupAppList();
        mAdapter = new CheckBoxAdapter(getActivity(), itemList);
        listView.setAdapter(mAdapter);
        setupSearch();
    }

刷新itemList,绑定CheckBoxAdapter,在碎片中显示出来

Settings.java在LogFragment和PrefsFragment两种模式下维护了选项菜单

展开阅读全文
APP
打赏
0
0 收藏
分享
加载中
更多评论
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部