1、用户的数据获取:
从服务器获取用户独有的数据信息,是通过cookies对用户的身份、进行session跟踪(存储在用户本地终端上、的数据,是经过加密的)
用途:
务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时
保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车”之类处理。用
户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后
付款时提取信息。
2、Android 中Activity,Window和View之间的关系
当我们调用Acitivity的 setContentView方法的时候实际上是调用的Window对象的setContentView方法,所以我们可以看出Activity中关于界 面的绘制实际上全是交给Window对象来做的。绘制类图的话,可以看出Activity聚合了一个Window对象。在该方法中,首先创建一个DecorView,DecorView是一个扩张FrameLayout的类,是所有窗口的根View。我们在Activity中调用的setConctentView就是放到DecorView中了。这是我们类图的聚合关系如下:Activity--->Window--->DecorView
3、java 中的static和final怎么使用?它们的区别?
static是静态修饰关键字,可以修饰变量和程序块以及类方法:当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存;修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。
final可以修饰变量、方法及类,当你定义一个final变量时,jvm会将其分配到常量池中,程序不可改变其值;当你定义一个方法时,改方法在子类中将不能被重写;当你修饰一个类时,该类不能被继承
3、Java中交互方式分为同步和异步两种:
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。
哪些情况建议使用同步交互呢?比如银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互。
4、activity之间的跳转
activity之间的传递靠Intent,数据传输靠Bundle
1)Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象。
Bundle.putSerializable(Key,Object); //实现Serializable接口的对象
Bundle.putParcelable(Key, Object); //实现Parcelable接口的对象
2)假如需要在两个activity间传递数据,我们通常都是用Bundle,但是里面似乎只有一些放置一些Java中已经有的数据类型,像String,int,double等,但如果要传递一个对象呢?不难发现Bundle中有一个方法putSerializable,利用该对象就可以传递对象了,不过传递的对象要实现Serializable接口。
5、html中post和get区别,是不是用get的方法用post都能办到?
1). get是从服务器上获取数据,post是向服务器传送数据。
2). get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3). 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4). get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5). get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1)、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2)、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
A.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
B.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。
继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。
6、Android自定义控件——ListView的下拉刷新与上拉加载
1)开源组件PullToRefreshList介绍
既然Android和Java都是开源的,一些常见的功能或者效果就不难被找到。PullToRefresh就是一个典型的例子,PullToRefresh是老外写的一个开源ListView组件,这个项目在ListView的基础上扩展了ListView的功能,增强了Listview的用户体验,功能十分强大,而且很容易被集成到当前的项目中,你只需要调用简单的API,即可省去很多不必要的麻烦,非常棒。
0. XListView继承ListView。
1. 下拉刷新组件是ListView的一个Header。在ListView创建时就将这个自定义View塞进去,默认情况是看不到的,所以这个HeaderView的高度初始设置为0。
2. 上拉载入更多组件是Footer,为了确保这个footer在最后(可能会添加多个自定义footer),在用户调用setAdatper的时候再把这个footer塞进去。
3. 覆写ListView的onTouchEvent方法,处理各种情况。
4. 用户松手,启动mScroller,将header、footer回滚到所需状态。
5. 添加了用户下拉、上拉移动delay的效果,类似iOS的行为。
6. 提供了两个接口:
a) IXListViewListener: 触发下拉刷新、上拉载入更多
b) OnXScrollListener: 这个和原生的OnScrollListener一样,但是在mScroller回滚时,也会触发这里的事件。
碰到的问题:
用户下拉回推时,不断修改header的高度,但这时候滚动条指示器的位置还是按老的高度计算的,需要强制调用一下setSelection(0)将ListView滚动到顶部。
7、设置背景颜色的透明度
控件ID.getBackground().setAlpha(30);//0~255透明度值(0完全透明)
8、设置布局进出动画控制显示隐藏
网址:android---控件隐藏与显示动画_zhiwen_xu的博客-CSDN博客
if (rl_bottom_dialog.getVisibility()==View.GONE){
//强制开启硬件加速,使用硬件渲染(防止动画卡顿)
rl_bottom_dialog.setLayerType(View.LAYER_TYPE_HARDWARE,null);
// 为控件View添加动画效果
rl_bottom_dialog.startAnimation(AnimationUtils.loadAnimation(TestActivity.this, R.anim.dialog_in));
rl_bottom_dialog.setY(0);
rl_bottom_dialog.setVisibility(View.VISIBLE);
}else{
rl_bottom_dialog.startAnimation(AnimationUtils.loadAnimation(TestActivity.this, R.anim.dialog_out));
rl_bottom_dialog.setY(-100);
rl_bottom_dialog.setVisibility(View.GONE);}
9、动态向布局中添加控件
//新建文本
TextView tv1 = new TextView(context);
tv1.setId(a);
//设置文本内容
tv1.setText(a+"."+str);
//设置字体颜色
tv1.setMaxEms(13);
tv1.setTextColor(context.getResources().getColor(R.color.mywhite));
//设置文本颜色
tv1.setTextSize(18);
//设置文本位置
tv1.setPadding(8, 8, 8, 8 );
View.addView( tv1 );---最重要的一句
注意:如果需要重复使用此布局,但是动态添加的控件不同,则需要在使用之前清空添加的控件
View.removeAllViews();
10、获取SHA256(开发版、正式版)
参考网址:手把手教你android studio terminal 命令获取SHA1和MD5、SHA256值_悟-静的博客-CSDN博客
a、开发版:
打开cmd,进入到.android文件下,输入命令:keytool -list -v -keystore debug.keystore
输入秘钥库口令:android
就显示出来MD5、SHA1、SHA256
b、正式版:
先创建项目的.jks签名文件
打开cmd,进入到.android文件下,输入命令:keytool -list -v -keystore 项目的.jks文件路径
输入秘钥库口令:签名文件的秘钥
就显示出来MD5、SHA1、SHA256
11、打开软件盘,布局向上移动
参考网址:Android软键盘(二) 软键盘弹出布局上移的问题_Ade-rui的博客-CSDN博客
<activity android:name=".MainActivity"
android:windowSoftInputMode="adjustResize|stateHidden">---这两个属性值需要都有
12、隐藏键盘
private void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive() && this.getCurrentFocus() != null) {
if (this.getCurrentFocus().getWindowToken() != null) {
imm.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
13、随机数生成
在一定范围内生成随机数.
比如此处要求在[0 - n)内生成随机数.注意:包含0不包含n
Random random=new Random();
random.nextInt(12)
14、汉字转拼音
参考网址:Android中汉字转拼音的两种方法,优劣比较_钟铭-CSDN博客
测试过:引用compile 'com.belerweb:pinyin4j:2.5.0' 加上 工具类Cn2Spell
15.jar下载地址
Jar File Download examples (example source code) Organized by topic
16.Android 7.0 FileUriExposedException 解决
说明:
从Android 7.0开始,一个应用提供自身文件给其它应用使用时,如果给出一个file://格式的URI的话,应用会抛出FileUriExposedException。这是由于谷歌认为目标app可能不具有文件权限,会造成潜在的问题。所以让这一行为快速失败。
参考网址:
Android笔记:Android 7.0 FileUriExposedException 解决_陈果的博客-CSDN博客
解决方法:在Application.onCreate加入如下代码,置入一个不设防的VmPolicy
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
17.在两个Activity之间如何传递一张图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_target);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("picture", b);
startActivity(intent);
Bundle extras = getIntent().getExtras();
byte[] b = extras.getByteArray("picture");
Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);
image.setImageBitmap(bmp);
18.解决二维码扫描时预览画面被拉伸
说明:
在测试ZXing提供的二维码扫描是出现了图片拉伸情况,Zxing是google提供的二维码扫描工程
源码默认是横屏状态, 在我们使用竖屏,摄像图片出现拉伸现象。
参考网址:Zxing图片纵向拉伸问题 Android 二维码扫描_baidu_15079577的博客-CSDN博客
修改CameraConfigurationManager类下的initFromCameraParameters()方法
19.DatePickerDialog解决部分手机不显示自定义取消、确定按钮
DatePickerDialog默认是带有取消、确定按钮,但是它的OnDateSetListener监听事件只是监听确定按钮
所以需要添加一个取消按钮即可
代码:
private Calendar calendar;// 用来装日期的
private DatePickerDialog dialog;
public void dateTimePicKDialog2(final EditText editText){
calendar = Calendar.getInstance();
dialog = new DatePickerDialog(activity,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
monthOfYear = monthOfYear+1;
System.out.println("年-->" + year + "月-->"
+ monthOfYear + "日-->" + dayOfMonth);
editText.setText(year + "-" + monthOfYear + "-"
+ dayOfMonth);
}
}, calendar.get(Calendar.YEAR), calendar
.get(Calendar.MONTH), calendar
.get(Calendar.DAY_OF_MONTH));
dialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("cancel~~cancel~~");
editText.setText("");
}
});
dialog.show();
}
20.android中sort()比较方法报错
报:Comparison method violates its general contract!
译:比较方法违反了它的一般约定!
说明:
JDK7中的Collections.Sort方法实现中,你的返回值需要严谨全面;
如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。
在在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性
参考网址:处理 Comparable接口不严谨导致Comparison method violates its general contract!_王学明-CSDN博客
21.Android Studio中使用.so文件
第一种方法:把.so文件放到 main下创建的jniLibs文件夹中
第二种方法:.so文件可以还是放在libs文件夹中,但是在app下的builde.gradle中
android {中加入
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}}
22.Android之Application引用方式
碰到的情况:
在项目中引用的库里边有自定义的Application,此application是应用于这个库的;但是在我的app项目中也需要进行自定义application,如果同时在app的配置文件和库的配置文件中声明各自的application是不行的,因为application只能声明一个
解决办法:
第一种:在库中的application不需要在库配置文件(AndroidManifest.xml)中声明,在App项目中自定义application并且继承的是库中application,最后在app项目的配置文件中声明自定义的application即可。
第二种:采用反射获取Application
参考网址:Android之Application引用方式_嘿,你好!-CSDN博客_android 获取application
23.Android中横竖屏切换,生命周期不重调
<activity
android:name=".activity.TestActivity"
android:configChanges="orientation|keyboardHidden|screenSize" />
说明:一般在AndroidManifest.xml文件中都没有使用到android:configChanges="keyboardHidden|orientation"配置,当然还是很有用的。就是如果配置了这个属性,当我们横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不会重新执行onCreate方法,那当然如果不配置这个属性的话就会重新调用onCreate方法了
参考网址:关于android:configChanges的属性 - carlo-z - 博客园
24.使用第三方库实现的Android底部日期选择器滚轮效果
Demo网址:https://github.com/787060894/Android-PickerView
库位置:https://github.com/Bigkoo/Android-PickerView
使用方法:
1.AS添加依赖: compile ‘com.contrarywind:Android-PickerView:3.2.6’
2.在Activity中添加如下代码:
TimePickerView pvTime = new TimePickerView.Builder(this, new TimePickerView.OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
btn_date.setText(getTime(date));
}
})
.setType(new boolean[]{true, true, true, false, false, false})// 默认全部显示
.setCancelText("取消")//取消按钮文字
.setSubmitText("确定")//确认按钮文字
//.setContentSize(18)//滚轮文字大小
//.setTitleSize(20)//标题文字大小
//
//.setTitleText("Title")//标题文字
//.setOutSideCancelable(true)//点击屏幕,点在控件外部范围时,是否取消显示
//.isCyclic(true)//是否循环滚动
//
//.setTitleColor(Color.BLACK)//标题文字颜色
//.setSubmitColor(Color.BLUE)//确定按钮文字颜色
//.setCancelColor(Color.BLUE)//取消按钮文字颜色
//
//.setTitleBgColor(0xFF666666)//标题背景颜色 Night mode
//.setBgColor(0xFF333333)//滚轮背景颜色 Night mode
//
//.setDate(selectedDate)// 如果不设置的话,默认是系统时间*/
//
// .setRangDate(startDate,endDate)//起始终止年月日设定
//
//.setLabel("年","月","日","时","分","秒")//默认设置为年月日时分秒
.isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
//.isDialog(true)//是否显示为对话框样式
.build();
pvTime.show();
25.读取A文件写入到B文件中
/**
* 读取A文件写入到B文件中
* @param readFileName
* 读取文件的完整路径
* @param writeFileName
* 写入文件的完整路径
*/
public static void readAToWriteB(String readFileName,String writeFileName){
try{
File file = new File(writeFileName);
FileOutputStream fos = new FileOutputStream(file);
//这是读取项目中assets下文件:InputStream inputStream = getAssets().open("test.txt");
//这是读取项目中raw下文件:InputStream is = getResources().openRawResource(R.raw.raw);
InputStream inputStream = new FileInputStream(readFileName);
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
String line = null;
while ((line = br.readLine()) != null) {
fos.write(line.getBytes());
}
}catch (Exception e){
}
}
26.截取字符串中的数字(包含带小数)
public static String getNumbers(String content) {
Pattern pattern = Pattern.compile("[\\d]+|[\\d]+[.][\\d]+");
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
return matcher.group(0);
}
return "";
}
27.UUID生成唯一数
参考网址:用java生成GUID_享受技术!享受快乐!-CSDN博客
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符,一般用16进制表示。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。
//按照时间信息,生成唯一一个十六位的数字,就是唯一性
String uid=UUID.randomUUID().toString();
//1到100随机数
int number=new Random().nextInt(100)+1;
28.插入耳机的时候也可以选择使用扬声器播放音乐
参考网址:android插入耳机状态使用扬声器外放音乐_I feel so close to you right now!-CSDN博客
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMicrophoneMute(false);
audioManager.setSpeakerphoneOn(true);//使用扬声器外放,即使已经插入耳机
setVolumeControlStream(AudioManager.STREAM_MUSIC);//控制声音的大小
audioManager.setMode(AudioManager.STREAM_MUSIC);
29.卸载APP
public void deleteApp(String packageName) {
//通过程序的包名创建URL
Uri packageURI = Uri.parse(packageName);
//创建Intent意图
Intent intent = new Intent(Intent.ACTION_DELETE);
//设置Uri
intent.setData(packageURI);
//卸载程序
startActivity(intent);
}
30.Android 中进度计算,以百分比显示
float pressent = (float) i / mNumber * 100;//i 增加数量,mBNumber 总数
mIvProgressBar.setProgress((int) pressent);
31.正则表达式截取整数或小数
(\\d+(\\.\\d+)?)
参考网址:正则表达式-提取字符串中的整数或小数_guoguicheng的博客-CSDN博客_正则表达式提取小数
32.应用内部发送广播
只能使用LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
不允许 context.sendBroadcast(intent), 避免外部应用拦截;
33.ListView中增加checkbox
在Item布局的根节点上设置descendantFocusability属性
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
如果想要实现CheckBox和item的点击事件都可以使用,则需要在Adapter适配器中监听CheckBox的点击事件
34.Android启动页
参考网址:Android中启动页的实现_邹奇健身已上瘾-CSDN博客_android启动页面
public class SplashActivity extends Activity {
private static final int WHAT_DELAY = 0x11;// 启动页的延时跳转
private static final int DELAY_TIME = 3000;// 延时时间
// 创建Handler对象,处理接收的消息
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case WHAT_DELAY:// 延时3秒跳转
goHome();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// 调用handler的sendEmptyMessageDelayed方法
handler.sendEmptyMessageDelayed(WHAT_DELAY, DELAY_TIME);
}
/**
* 跳转到主页面
*/
private void goHome() {
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();// 销毁当前活动界面
}
}
参考网址:Android启动页的简单实现 - 简书
public class LunchActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
new Thread( new Runnable( ) {
@Override
public void run() {
//耗时任务,比如加载网络数据
runOnUiThread(new Runnable() {
@Override
public void run() {
// 这里可以睡几秒钟,如果要放广告的话
// sleep(3000);
Intent intent = MainActivity.newInstance(LunchActivity.this);
startActivity(intent);
LunchActivity.this.finish();
}
});
}
} ).start();
}
}
AndroidManifast.xml配置
<activity
android:name=".LunchActivity"
android:theme="@style/LunchTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
style.xml文件配置
<style name="LunchTheme" parent="Theme.AppCompat">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<!--下面这句如果你加上觉得好看就加,不好看就不加咯-->
<!--<item name="android:navigationBarColor">@color/transparent</item>-->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowBackground">@drawable/ic_logo</item>
</style>
35.安卓手机中的.dat文件
手机内存中的.dat文件是缓存文件,如果想要打开,则把后缀.dat改成flv即可(是视频文件)
36.Android中EditText的监听事件
参考网址:Android中EditText的三种监听事件_好的品牌,自带传播力-CSDN博客
Android应用开发之Android EditText 监听用户输入完成的实例-职坐标
et001.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//text 输入框中改变前的字符串信息
//start 输入框中改变前的字符串的起始位置
//count 输入框中改变前后的字符串改变数量一般为0
//after 输入框中改变后的字符串与起始位置的偏移量
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//text 输入框中改变后的字符串信息
//start 输入框中改变后的字符串的起始位置
//before 输入框中改变前的字符串的位置 默认为0
//count 输入框中改变后的一共输入字符串的数量
}
@Override
public void afterTextChanged(Editable editable) {
//edit 输入结束呈现在输入框中的信息
}
});
监听用户输入完成的实例
EditText editText = (EditText) findViewById(R.id.edit);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
//输入时的调用
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mHandler.removeCallbacks(mRunnable);
//800毫秒没有输入认为输入完毕
mHandler.postDelayed(mRunnable, 800);
}
@Override
public void afterTextChanged(Editable editable) {
Log.d(TAG, "onTextChanged() returned: 2222");
}
});
配合Handler使用:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (0 == msg.what) {
Log.d(TAG, "handleMessage() returned:输入完成 " );
}
}
};
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(0);
}
};
37.SharedPreference为什么不适合存储大量数据
参考网址:SharedPreference为什么不适合存储大量数据_YanRu的专栏-CSDN博客_android sharedpreferences 存储大小
SharedPreference(下文简称sp)是一种轻量级的存储方式,是它的设计所决定的:sp在创建的时候会把整个文件全部加载进内存,如果你的sp文件比较大,那么会带来几个严重问题:
- 第一次从sp中获取值的时候,有可能阻塞主线程,使界面卡顿、掉帧。
- 解析sp的时候会产生大量的临时对象,导致频繁GC,引起界面卡顿。
- 这些key和value会永远存在于内存之中,占用大量内存。
38.Android8.0以上含Android9.0系统调试闪退崩溃
解决方法:
AndroidManifest.xml中
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"----------Android9.0 默认是禁止所有的http请求的
android:theme="@style/AppTheme">
<!--android9闪退-->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
参考网址:AndroidStudio在Android9上调试闪退的问题_生擒嫦娥炖玉兔的博客-CSDN博客
39.Android 更新设置进度显示小数
参考网址:安卓 ProgressBar 显示小数的方法_晓游的专栏-CSDN博客 -----这个方法比较简单
安卓 ProgressBar 显示小数的方法_晓游的专栏-CSDN博客
APP强制更新逻辑_weixin_34383618的博客-CSDN博客
自定义显示格式:
progressDialog.setProgressNumberFormat("%1d kb/%2d kb");
当前进度填入%1d位置,总数填入%2d。
这个方法是自动填充的,只要在初始化时,加上这一句,
调用progressDialog.setMax(int )后会自动将总数填入%2d.
同理,调用progressDialog.setProgress(int )后会自动将当前进度填入%1d.
但是,从setMax,setProgress的输入参数可知这2个方法只接收整数。
如果进度显示的样式只要求为整数形式,那么在初始化时,定义一次
progressDialog.setProgressNumberFormat("%1d kb/%2d kb"); 就可以了。
那要如何显示小数呢? 很简单,既然setProgressNumberFormat()能显示自定义的"/","kb",
这些字符,那么就能显示我们需要的自定义字符串。所以,干脆就让这个方法不接收前面
说的当前进度%1d,和总数%2d,而是直接显示我们需要的处理好的字符串即可:
(文件大小fileLength,已下载大小downLength)
初始化时: progressDialog.setMax(fileLength);
每一次刷新下载进度时:
progressDialog.setProgress(downLength);
float all = fileLength/1024/1024;
float percent = downLength/1024/1024;
progressDialog.setProgressNumberFormat(String.format("%.2fM/%.2fM", percent, all));
注意:setProgressNumberFormat这个方法要求版本最小为 android:minSdkVersion="11"
40.带有角标的iamgeview,类似于qq、微信未读消息提示效果
参考网址:https://github.com/huanglinqing123/ImageviewBound
41.Java中String转Int(getInteger和parseInt区别)
String转Int方法:int a = Integer.parseInt("123");
参考网址:https://www.cnblogs.com/zl1991/p/6669582.html
42.Android调用系统相机录制视频并保存本地
参考网址:android调用系统相机录制视频并保存本地_weikai_的博客-CSDN博客_android 调用相机录像并保存到本地
注意:intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);//1.高质量视频,如果是0则有可能视频格式改变(一般录制的视频
编码格式是AVC(H264))