Android - 数据库自动更新,横竖屏切换,系统控件样式,Fragment添加到Activity,Fragment生命周期,缓存,获取/清除缓存

转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72900395

1.本地数据库自动更新的工作机制

  1. 开启一个服务,定时访问服务器
  2. 进行版本对比,如果最新版本比较高,获取需要更新的内容
  3. 将新内容插入到本地数据库中

2.如何处理横竖屏切换

  1. 指定屏幕朝向
    在清单文件对应的Activity中配置android:screenOrientation=”landscape”(横屏,portrait是竖屏);
  2. 设置屏幕旋转时不重新创建Activity
    在清单文件对应的Activity中配置android:configChanges=”keyboardHidden|orientation|screenSize”,最好这三个都配置,否则不能适配所有机型或sdk版本。
    横竖屏切换时会走Activity的onConfigurationChanged()方法

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // 当新设置中,屏幕布局模式为横排时
        if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
            //TODO 某些操作
        }else{
            //TODO 某些操作
        }
        super.onConfigurationChanged(newConfig);
    }
    

3.系统控件的样式在哪里定义

  1. 找到文件:sdk/platforms/某个版本/data/res/values/styles.xml
  2. 搜索关注的控件,如ProgressBar

    <style name="Widget.ProgressBar.Horizontal">
        //indeterminate不确定
        <item name="android:indeterminateOnly">false</item>
        //进度条使用的图片
        <item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
        //进度不确定的时候使用的图片,如安装APK时系统的进度条
        <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
        <item name="android:minHeight">20dip</item>
        <item name="android:maxHeight">20dip</item>
    </style>
    

4.Fragment添加到Activity上有哪些步骤?

//获得管理器
FragmentManager fm = getSupportFragmentManager();

//获得切换Fragment的帮助类,有add添加、delete删除、replace替换、hide隐藏、show显示
FragmentTransaction ft = fm.beginTransaction();

//创建Fragment
CleanCacheFragment f1 = new CleanCacheFragment();
ft.replace(R.id.fl_container, f1);

//提交切换Fragment的事务
ft.commit();

5.Fragment的生命周期

  1. onAttach():Fragment对象跟Activity关联时

  2. onCreate():Fragment对象的初始创建时

  3. onCreateView():创建Fragment的View对象时

  4. onActivityCreate():所依附的Activity对象已经完成了Activity.onCreate()方法时

  5. onStart():界面即将显示给用户,当Activity的onStart方法调用时

  6. onResume():可以获取焦点与用户交互,当Activity的onResume调用时

  7. onPause():Activity被遮挡不可获取焦点调用了onPause时,或者Activity(或其他容器)打开另一个Fragment,当前Fragemnt无法获取焦点时

  8. onStop():Activity不可见调用了onStop()时,或者Activity(或其他容器)打开另一个Fragment当前Fragment不再显示给用户时

  9. onDestroyView():Fragment中的View对象即将被从当前界面中移除时

  10. onDestroy():Fragment对象被销毁时

  11. onDetach():在Fragment对象不再跟它依附的Activity关联的时候,方法会立即被调用

6.缓存

    路径:data/data/包名/cache。用于存放临时文件,当系统空间不足时会清空该目录数据

//获取缓存文件夹
context.getCacheDir(); 

7.如何从应用源码中定位实现逻辑

  1. 通过UI上一些字符串进行全局搜索,Ctrl+H 中的 FileSearch
  2. 通过string.xml中对应字符串id定位layout布局
  3. 通过layout布局中的id,定位代码中该View的事件逻辑

8.如何获取应用的缓存

  1. 经过分析源码,发现获取应用的缓存可以使用packageManager.getPackageSizeInfo()方法
  2. pm的getPackageSizeInfo()方法为hide,无法直接调用,所以使用反射调用该方法
  3. getPackageSizeInfo()需要两个参数,第一个为包名,第二个为一个回调接口IPackageStatsObserver.Stub这种形式一般为远程调用系统服务,需要使用aidl,将aidl文件拷贝到本项目中,注意要使用aidl文件中的原始包名
  4. 代码实现,需要权限

    //1.获得packageManager对象
    PackageManager pm = getPackageManager();
    
    //2.pm的getPackageSizeInfo()方法为hide,使用反射调用
    Method[] methods = PackageManager.class.getDeclaredMethods();
    for(Method method:methods){
        if("getPackageSizeInfo".equals(method.getName())){
            try {
    
                //3.第二个参数需要使用aidl创建
                method.invoke(pm, "com.mythmayor.testcache",new IPackageStatsObserver.Stub(){
                    @Override
                    public void onGetStatsCompleted(PackageStats pStats,
                            boolean succeeded) throws RemoteException {
                        long cacheSize = pStats.cacheSize;
                        System.out.println("缓存大小:"+cacheSize);
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
            return;
        }
    }
    

9.如何清除一个应用的缓存

需要应用为系统应用

packageManager.deleteApplicationCacheFiles(String packageName,IPackageDataObserver observer)
权限:要求系统应用
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />

打开应用详细信息界面

Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:"+info.packName));
startActivity(intent);

10.清除全部应用缓存

利用系统漏洞,google忘记把CLEAR_APP_CACHE权限声明为只有系统应用才可以申请的权限

//建议Long.MAX_VALUE。
PackageManager.freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer);
//权限
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值