if (begIndex != -1) {
tempsuffix = filePath.substring(begIndex + 1, filePath.length());
if (tempsuffix.equals(suffix)) {
lstFileNames.add(filePath);
}
}
} else {
lstFileNames.add(filePath);
}
}
return lstFileNames;
}
**6.context.getExternalFilesDir()和context.getExternalCacheDir()方法**
应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。
而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项。所以重要的,需要长期保存的文件不要放在此处。
/**
* 获取Temp目录
* @param context
* @return
*/
public static String GetTempFileSavePath(Context context)
{
if(context==null)
{
return "";
}
String strTempPath = "";
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable())
{
strTempPath = String.valueOf(context.getExternalCacheDir());
}
else
{
strTempPath = String.valueOf(context.getCacheDir());
}
if(strTempPath.equalsIgnoreCase("null"))
{
strTempPath = String.valueOf(context.getCacheDir());
}
if (!strTempPath.endsWith("/"))
{
strTempPath += "/";
}
File file = new File(strTempPath);
if (!file.exists())
{
file.mkdirs();
}
return strTempPath;
}
获取sd卡路径
/**
* Android SD卡路径
*/
public String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED); //判断sd卡是否存在
if (sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();//获取根目录
}
return sdDir.toString();
}
使用时:在后面加上斜杠,在加上文件名
String fileName = getSDPath() +"/" + name;//以name存在目录中
注意添加权限
假如出现以下错误
Android中的文件存储位置:java.io.FileNotFoundException: xxx: open failed: EROFS (Read-only file system)
==============================================================================================
保存文件时路径不对,貌似是少了个“/”。
最好用File fullFilename = new File(extDir, filename); 代替 File f2=new File(path);
**7.对整个屏幕视图进行截屏并生成图片**
Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片.
网上收集到有2种方法
public static Bitmap convertViewToBitmap(View view, int bitmapWidth, int bitmapHeight){
Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
view.draw(new Canvas(bitmap));
return bitmap;
}
或者
public static Bitmap convertViewToBitmap(View view){
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
一般情况下,这2个方法能够正常的工作。但有时候,生成Bitmap会出现问题(Bitmap全黑色)。主要原因是 drawingCache的值大于系统给定的值。
较好的解决方案是
public static Bitmap convertViewToBitmap(View view){
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
**8.Android三种实现定时器的方法**
方法一:Handler+Thread
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
/**
-
handler定时器
*/
public class HanderDemoActivity extends Activity {
TextView tvShow;
private int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvShow = (TextView) findViewById(R.id.tv_show);
new Thread(new ThreadShow()).start();
}
// handler类接收数据
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
tvShow.setText(Integer.toString(i++));
System.out.println("receive....");
}
};
};
// 线程类
class ThreadShow implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(1000);
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
System.out.println("send...");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("thread error...");
}
}
}
}
}
方法二:Handler类自带的postDelyed
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
/**
-
handler定时器使用postDelyed实现
*/
public class HanderDemoActivity extends Activity {
TextView tvShow;
private int i = 0;
private int TIME = 1000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvShow = (TextView) findViewById(R.id.tv_show);
handler.postDelayed(runnable, TIME); //每隔1s执行
}
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
// handler自带方法实现定时器
try {
handler.postDelayed(this, TIME);
tvShow.setText(Integer.toString(i++));
System.out.println("do...");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("exception...");
}
}
};
}
方法三:Handler+Timer+TimerTask
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
/**
-
定时器实现:Handler+Timer+TimerTask
*/
public class HanderDemoActivity extends Activity {
TextView tvShow;
private int i = 0;
private int TIME = 1000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvShow = (TextView) findViewById(R.id.tv_show);
timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
tvShow.setText(Integer.toString(i++));
}
super.handleMessage(msg);
};
};
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
// 需要做的事:发送消息
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
}
综合比较三种方法,**推荐第二个**。因为第一个Thread.sleep会占用线程资源,当Sleep的时候,就等于说:现在我不用,但是你也别想用。虽然没占用CPU资源,但是阻碍了线程的调度。第三个话,在run方法中会不断的new 对象,为了实现定时,而不断创建对象而浪费资源,不合算。
**9.Android 倒计时功能**
主要是利用了CountDownTimer类
class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔
}
@Override
public void onFinish() {// 计时完毕时触发
bt.setText("重新验证");
bt.setClickable(true);
bt.setBackgroundColor(0x77ffffff);
}
@Override
public void onTick(long millisUntilFinished) {// 计时过程显示
bt.setClickable(false);
bt.setBackgroundColor(0x77cccccc);
bt.setText("还剩下"+millisUntilFinished / 1000 + "秒");
}
}
要用的时候```
mTimeCount=new TimeCount(10000, 1000);
mTimeCount.start();
10,Android常用Http请求的封装
先定义请求结果返回的接口
/**
* 回调服务返回的接口
*
*/
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}
请求代码
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/39b01ce8acb29cfe60e0eb7ef0d35e57.png)
![img](https://img-blog.csdnimg.cn/img_convert/24f98cbf437d41c48321688666736080.png)
![img](https://img-blog.csdnimg.cn/img_convert/b252b98a82f05ae5c70fdbea5ad491e8.png)
![img](https://img-blog.csdnimg.cn/img_convert/14fb62bfcc43195b032e0fc0de6293d2.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c6915fbee3416e7afd90c9fe776320e.png)
![img](https://img-blog.csdnimg.cn/img_convert/a1813616f122ca82b7f3216125010c03.png)
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/e330a719a4975fefb30e0f8a0e539fb6.png)
## 文末
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
> 这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套**进阶学习的视频及面试专题资料包**,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家
![](https://img-blog.csdnimg.cn/img_convert/4128d003f9bb4a09163831e3b488abdf.webp?x-oss-process=image/format,png)
外链图片转存中...(img-DvEjCv8W-1711920085377)]
[外链图片转存中...(img-4Ti67LGA-1711920085378)]
[外链图片转存中...(img-oKpWp2x1-1711920085378)]
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中...(img-h1U2PXHG-1711920085378)]
## 文末
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
> 这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套**进阶学习的视频及面试专题资料包**,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家
[外链图片转存中...(img-12hd85cv-1711920085379)]
> **本文已被[CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**