Android手机系统开发遇到问题分析

官方文档:

android开发中文文档:
https://developer.android.google.cn/guide/topics/security/permissions#normal-dangerous

1 PopupWindow 显示位置不对,计算PopupWindow的高度一直显示-2
当PopupWindow定义为ViewGroup.LayoutParams.WRAP_CONTENT时计算高度就会不准确需要重新measure高度代码如下:

    private void showPopupWindow() {
        popupWindow = new PopupWindow(tvPopup, ViewGroup.LayoutParams.WRAP_CONTENT, 			ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setContentView(LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_popup, null));
        popupWindow.setBackgroundDrawable(new ColorDrawable(0xff0));
        getViewLocation(tvPopup, popupWindow);
    }

    private void getViewLocation(View textview, PopupWindow pop) {
        int[] location = new int[2];
        textview.getLocationOnScreen(location);
        System.out.println("view的宽location[0] = " + location[0]);
        System.out.println("view的高location[1] = " + location[1]);
        popupWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        int popHeight = popupWindow.getContentView().getMeasuredHeight();
        System.out.println("pop_height = " + popHeight);
        pop.showAtLocation(textview, Gravity.NO_GRAVITY,
                location[0], location[1] - popHeight);
    }

2 应用首次启动获取连续多个权限

参考:
https://blog.youkuaiyun.com/u013836857/article/details/51445532?utm_source=blogxgwz5
https://blog.youkuaiyun.com/ngh8897/article/details/58088131
https://blog.youkuaiyun.com/itachi85/article/details/77826112?utm_source=gold_browser_extension

package cn.nubia.permissiondemo;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private List<String> needPermission;

    private final int REQUEST_CODE_PERMISSION = 0;

    private String[] permissionArray = new String[]{
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        askMultiplePermission();
    }

    public void askMultiplePermission() {
        needPermission = new ArrayList<>();
        for (String permissionName : permissionArray) {
            if (!checkIsAskPermission(this, permissionName)) {
                needPermission.add(permissionName);
            }
        }

        if (needPermission.size() > 0) {
            //开始申请权限
            ActivityCompat.requestPermissions(this, needPermission.toArray(new String[needPermission.size()]), REQUEST_CODE_PERMISSION);
        } else {
            //获取数据
            Log.e("gordon","获取数据1");
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
//        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST_CODE_PERMISSION:
                Map<String, Integer> permissionMap = new HashMap<>();
                for (String name :
                        needPermission) {
                    permissionMap.put(name, PackageManager.PERMISSION_GRANTED);
                }

                for (int i = 0; i < permissions.length; i++) {
                    permissionMap.put(permissions[i], grantResults[i]);
                }
                if (checkIsAskPermissionState(permissionMap, permissions)) {
                    //获取数据
                    Log.e("gordon","获取数据2");
                } else {
                    //提示权限获取不完成,可能有的功能不能使用
                    Toast.makeText(this, "权限不足!", Toast.LENGTH_SHORT).show();
                }

                break;
        }
    }

    public boolean checkIsAskPermission(Context context, String permission) {
        if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        } else {
            return true;
        }

    }

    public boolean checkIsAskPermissionState(Map<String, Integer> maps, String[] list) {
        for (int i = 0; i < list.length; i++) {
            if (maps.get(list[i]) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
}

3 LeakCanary检测内存泄漏

https://blog.youkuaiyun.com/junhuahouse/article/details/79731529
https://blog.youkuaiyun.com/u010023795/article/details/53888511
https://blog.youkuaiyun.com/u010218288/article/details/80577808

1、在gradle.build

dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
    // Optional, if you use support library fragments:
    debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.2'
}

2、写一个application类

package cn.nubia.mobilesecurityguard;

import android.app.Application;
import android.content.Context;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;

public class SysApplication extends Application {

    public static RefWatcher getRefWatcher(Context context) {
        SysApplication application = (SysApplication) context.getApplicationContext();
        return application.refWatcher;
    }

    private RefWatcher refWatcher;

    @Override
    public void onCreate() {
        super.onCreate();
        if (LeakCanary.isInAnalyzerProcess(this)) {
            // This process is dedicated to LeakCanary for heap analysis.
            // You should not init your app in this process.
            return;
        }
        refWatcher = LeakCanary.install(this);
        // Normal app init code...
    }
}

3、在基类activity中
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        RefWatcher refWatcher = SysApplication.getRefWatcher(this);
        refWatcher.watch(this);
}
4、fragment
        RefWatcher refWatcher = SysApplication.getRefWatcher(this);
        refWatcher.watch(this);

4 简单自定义进度条ProgressBar

详情:一层又一层的效果叠加
1. 在res/drawable下创建custom_progress.xml
2. 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <rotate
            android:drawable="@drawable/spinner_big_inner"
            android:fromDegrees="0"
            android:toDegrees="1440"
            android:pivotX="50%"
            android:pivotY="50%"
            >
        </rotate>
    </item>

    <item>
        <rotate
            android:fromDegrees="1440"
            android:toDegrees="0"
            android:drawable="@drawable/spinner_big_outer"
            android:pivotX="50%"
            android:pivotY="50%"
            >
        </rotate>
    </item>
</layer-list>
3.在对应的布局文件中设置进度条的状态
<ProgressBar
     android:indeterminateDrawable="@drawable/custom_progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值