Android,java知识点总结(三)

1、umeng分享通过QQ跟QQ空间分享成功或者取消分享没有回调问题

是因为在你的Activity中你自己处理了onActivityResult,而没有调用super.onActivityResult()

2、Android 让应用安装以后自动获取所需的权限(部分特殊权限无法获取)

因为android权限一直在变化,尤其是6.0,7.0, 8.0变化都很多,而且需要动态申请,那么如何让apk在安装成功以后默认开启所需要的权限呢。

可以通过设置targetSdkVersion 的版本号小于23。 默认安装以后权限都是允许。

但是使用这样的方式会引起其他一些问题,
比如:无法使用动态申请权限,判断是否还某个权限需要用PermissionChecker.checkSelfPermission
,跳转设置页面问题(某些应用无法直接跳转到应用权限设置)

3、新建项目如果出现找不到Unable to resolve dependency for’:app@debugAndroidTest/compileClasspath’: Could not resolve junit:junit:4.12.

  • 解决方式一:直接删除junit的测试文件跟项目测试代码,删除干净
  • 添加如下代码带项目的build.gradle文件中,添加阿里云镜像。
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.1.51'
    repositories {
        jcenter{
            url 'http://jcenter.bintray.com/'
        }
//        maven {
//            url 'http://maven.aliyun.com/nexus/content/repositories/releases/' //阿里云仓库地址
//        }
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {

        google()

//        maven {
//            url 'http://maven.aliyun.com/nexus/content/repositories/releases/' //阿里云仓库地址
//        }
        jcenter{
            url 'http://jcenter.bintray.com/'
        }
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

也许以上的方式以后还是没有解决问题,那么重启电脑,也许会有惊喜。

4、Scroller的使用,通过对Scroller源码解析

以及配合view来实现滑动效果可以知道。
Scroller只是一个View滑动的辅助工具类,可以通过该类的对象实时获取当前View的位置,然后通过View自己的绘制过程中调用computeScroll来通过ScrollTo方法来进行滑动,
在滑动过程中要重点注意的就是事件的传递,拦截,还有滑动位置的计算。

5、实现滑动退出Activity功能

使用SwipeLayouyt库,但是没有办法实现状态栏的沉浸式变化,也就是滑动退出的时候,状态栏也要变换颜色。
实现方式,添加状态栏为透明状态栏,然后通过动态设置startBar来显示。

代码:

public class StateBarTranslucentUtils {
    public static void setStateBarTranslucent(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4 全透明状态栏
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0 全透明实现
            // activity.getWindow().setStatusBarColor(Color.TRANSPARENT);  //直接用这个方法会有兼容性问题
            Window window = activity.getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);//calculateStatusColor(Color.WHITE, (int) alphaValue)
        }
    }


    public static void setStateBarColor(Activity activity) {
        // 设置状态栏颜色
        ViewGroup contentLayout = (ViewGroup) activity.findViewById(android.R.id.content);
        setupStatusBarView(activity, contentLayout, Color.parseColor("#FFe04f4c"));

        // 设置Activity layout的fitsSystemWindows
        View contentChild = contentLayout.getChildAt(0);
        contentChild.setFitsSystemWindows(true);
    }

    public static void setWeatherStateBarColor(Activity activity) {
        // 设置状态栏颜色
        ViewGroup contentLayout = (ViewGroup) activity.findViewById(android.R.id.content);
        setupStatusBarView(activity, contentLayout, Color.parseColor("#3F9CD6"));
        // 设置Activity layout的fitsSystemWindows
        View contentChild = contentLayout.getChildAt(0);
        contentChild.setFitsSystemWindows(true);
    }
    public static void setCityBarColor(Activity activity) {
        // 设置状态栏颜色
        ViewGroup contentLayout = (ViewGroup) activity.findViewById(android.R.id.content);
        setupStatusBarView(activity, contentLayout, Color.parseColor("#ff3097fd"));

        // 设置Activity layout的fitsSystemWindows
        View contentChild = contentLayout.getChildAt(0);
        contentChild.setFitsSystemWindows(true);
    }
    private static void setupStatusBarView(Activity activity, ViewGroup contentLayout, int color) {

        View mStatusBarView = null;

        View statusBarView = new View(activity);
        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
        contentLayout.addView(statusBarView, lp);

        mStatusBarView = statusBarView;


        mStatusBarView.setBackgroundColor(color);
    }

    /**
     * 获得状态栏高度
     */
    private static int getStatusBarHeight(Context context) {
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        return context.getResources().getDimensionPixelSize(resourceId);
    }

}

6、ScrollView

该控件中嵌套可滑动自定义View的时候,如果在滑动其中View的时候,事件如果可以传递回ScrollView中的话,那么要在自定义View中对onTouchEvent的Action_cancle
做处理,否则会出现界面卡在方式滑动的位置。

7、Chain validation failed 证书验证失败

(1)证书颁发验证有问题
(2)手机时间错误,或者是请求的时候系统时间错误,导致超过了证书的有效期。

8、耗时的操作

1)网络请求
(2)数据库查询
(3)复杂计算
(4)加载字体文件生成Typeface对象
(5)布局嵌套层数太深
(6)自定义View的时候重新绘制次数太频繁
(7)ViewGroup中动态添加多个View,重新计算ViewGroup的高度
如果能在app加载的时候创建的东西,尽量创建,可以节约动态创建时的成本。

9、一个大坑

相信现在很多人都在用CoordinatorLayout + ViewPager + Fragment+ RecycleView等来做写布局文件。而且在写的过程中也许会有滑动卡顿的问题,然后我们会给RecycleView设置俩个方法
mRecycle_infomation.setHasFixedSize(true);
mRecycle_infomation.setNestedScrollingEnabled(false)
那么你要注意了,如果设置了这俩个属性以后,ViewPager可能不会跟着最外边的控件进行滑动,而是自己滑动。在布局的时候一定要想清楚

10、使用AppbarLayout的返回顶部功能

如果AppbarLayout在滑动过程中滑出屏幕外以后,如何让他在回调顶部,也就是展开AppbarLayout布局:
通过设置他的

mAppBarLayout!!.setExpanded(true);
mAppBarLayout!!.setExpanded(true,true)

11、无声通知栏,悬挂式通知栏

无声通知栏需要使用老版本的通知方式
最新版android如果设置通知组,那么点击Intent 需要设置new_task ,否则的话点击通知组会再次吊起应用启动页
悬挂式通知栏:6.0以下是ok的,但是6.0以上的话默认都是关闭状态,不会弹出,除非是原生系统。否则需要手动去设置里边开启通知

12、关于Webp图片的使用

android正式支持webp是在2.2.1以后,所以在使用WebP的时候如果是小于这个版本的话,那么会出现奔溃或者是出现空白这样的情况。
解决方式:
1、自己添加WebP支持,需要使用ndk
2、转webP为png或者jpg。
3、提高自己应用的targetSdk的版本

13、Android 在6.0以上手动关闭权限的话,会导致应用重启,但是重启的时候会有白屏或者黑屏的问题。

解决方式是通过设置清单文件中Activity的theme,设置windowBackGround为启动图即可。

14、PendingIntent问题

android中很多地方会用到PendingIntent,很多人在使用的时候都是

PendingIntent.getActivity(context, 0,
new Intent(context, SplashActivity.class),
endingIntent.FLAG_UPDATE_CURRENT)

或者
PendingIntent.getBroadcast(context, 0,
new Intent(context, CandlarWidget.class)
.setAction(ACTION_RESET_MONTH),
PendingIntent.FLAG_UPDATE_CURRENT)

可以发现requestCode都使用0,一般来说可能没有问题,但是如果有很多地方都使用到了同一个Activity或者Service或者BroadReceiver的话,那么requestCode的值一定不能相同,否则可能会导致你再不同地方使用的Intent总是同一个。数据也是相同的数据。一定要使用不同的值。

猜你喜欢

转载自blog.csdn.net/u012808234/article/details/80340682