官方文档:
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"
/>