获取系统中安装的应用
//包管理器(应用包的信息获取)
PackageManager pm = context.getPackageManager();
//获取安装的应用
List<PackageInfo> list = pm.getInstalledPackages(0);
如果要获取用户安装的应用,则需要检测每个应用信息中的flag
PackageInfo info = list.get(i);
//用户安装
if(info.applicationInfo.flags != info.applicationInfo.FLAG_SYSTEM){
//获取应用包名
String packageName = info.packageName;
//应用名称
String appName = info.applicationInfo.loadLabel(pm).toString();
//版本名称
String versionName = info.versionName;
//应用图片
Drawable d = info.applicationInfo.loadIcon(pm);
...
}
线程池
ExecutorService类表示管理线程的容器,创建方式由Executors这个工厂类来创建
//线程池
private ExecutorService mService;
//创建线程池对象
//创建一个最大数量的线程池
mService = Executors.newFixedThreadPool(6);
// Executors.newCachedThreadPool()根据需要来创建工作线程的线程池
空闲线程一般等待60秒,如果没有任务需要处理将会被线程池回收
//线程池执行任务
Future f = mService.submit(Runnable...);
通过Future可以控制提交的任务,可以知道提交任务的执行状态
f.cancel(true) 取消任务
f.isCancelled() 检测是否被取消
f.isDone() 检测是否执行完毕
提交任务也可以用execute(这种方式不可控)
mService.execute(Runnable...)
Java中设置文本框的drawable
//设置文本周围的图标(设置右边有一个指示箭头)
tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.main_page_storage_bar_arrow, 0);
参数分别为drawableLeft,drawableTop,drawableRight,drawableBottom的资源
设置drawable和文本的边距
tv.setCompoundDrawablePadding(dp2px(5));
关于Android设备单位换算
dp转为px
private float dp2px(int dpValue) {
//获取屏幕密度
float density = getActivity().getResources().getDisplayMetrics().density;
return dpValue * density + 0.5;
}
px转为dp
private float px2dp(int pxValue) {
//获取屏幕密度
float density = getActivity().getResources().getDisplayMetrics().density;
return pxValue / density + 0.5;
}
DialogFragment
可以将Fragment以Dialog的形式显示出来
定义DialogFragment
public class NewFolderFragment extends DialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//无标题
setStyle(DialogFragment.STYLE_NO_TITLE, 0);
// setCancelable(false); //配置是否可以按返回键隐藏Dialog
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container
, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_new_folder, container, false);
return layout;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
view.findViewById(R.id.btn_cancel).setOnClickListener(btnOnClick);
view.findViewById(R.id.btn_sure).setOnClickListener(btnOnClick);
}
private View.OnClickListener btnOnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_cancel:
dismiss();
break;
case R.id.btn_sure:
//处理文件夹新建的事情
dismiss();
break;
}
}
};
}
显示
private NewFolderFragment newFolderFragment;
private void showNewFolderDialog(){
if(null == newFolderFragment){
newFolderFragment = new NewFolderFragment();
}
//配置初始信息
//显示
newFolderFragment.show(getFragmentManager(),"newFolder");
}
主对象和从对象之间的通讯的问题
假设有类A和类B,A中对B有一个引用,这时候我们将A表示主,B表示从,情况如下:
class B{
...
public void setData(Object data)...
}
class A{
...
B b;
...
}
主向从中传递内容,可以直接用对象.方法(数据)
A-->B b.setData(...)
从向主传递数据,一般建议使用回调,可以在B中定义一个接口,然后对接口持有引用,在A中实现接口并且传递实现对象到B中,让B处理完事情时使用接口
实现对象返回数据
class B{
...
public void setData(Object data)...
public void doSomeThing(){
...
//返回结果给主
if(null != callBack){
callBack.onResult(...);
}
}
public interface CallBack{
void onResult(Object data);
}
private CallBack callBack;
public void setCallBack(CallBack callBack){
this.callBack = callBack;
}
}
class A{
B b;
void init(){
b = new B();
b.setCallBack(new CallBack(){
public void onResult(Object data){
//接收从B传过来的数据
}
});
}
}
新建文件夹的逻辑
public class NewFolderFragment extends DialogFragment {
...
//处理文件夹新建
//创建好了,告诉文件列表将新创建好的文件显示出来
if(null != onCreateListener){
onCreateListener.onCerateOk(f);
}
...
/**
* 定义了创建结果的监听器
*/
public interface OnCreateListener{
void onCerateOk(File file);
}
private OnCreateListener onCreateListener;
public void setOnCreateListener(OnCreateListener onCreateListener) {
this.onCreateListener = onCreateListener;
}
}
文件列表调用新建文件夹的Fragment
private NewFolderFragment newFolderFragment;
private void showNewFolderDialog() {
if (null == newFolderFragment) {
newFolderFragment = new NewFolderFragment();
//设置结果处理监听
newFolderFragment.setOnCreateListener(new NewFolderFragment.OnCreateListener() {
@Override
public void onCerateOk(File file) {
FileItem item = FileUtil.getInstance().file2FileItem(file);
adapter.addFirstItem(item);
}
});
}
//配置初始信息
newFolderFragment.setFolder(currentFolder);
//显示
newFolderFragment.show(getFragmentManager(), "newFolder");
}
Fragment调用Activity中的方法
Activity中嵌入了Fragment,则在Fragment中可以通过getActivity()方法得到所依赖的目标Activity,如MainActivity中嵌入了文件列表FragmentFileList
MainActivity:
public class MainActivity extends AppCompatActivity{
...
//显示/隐藏标题中的选择视图
public void setTitleToosVisible(boolean isVisibility) {
if (isVisibility) {
selectToolsLayout.setVisibility(View.VISIBLE);
} else {
selectToolsLayout.setVisibility(View.GONE);
}
}
//改变标题全选文本
public void setSeleteAllText(boolean isSelectAll){
if(isSelectAll){
tvSelectAll.setText("取消全选");
}else{
tvSelectAll.setText("全选");
}
}
...
}
FragmentFileList:
...
if (!isSelectMode) {
//进入选择模式
isSelectMode = true;
//显示选择模式的页面效果
selectModeToolsLayout.setVisibility(View.VISIBLE);
((MainActivity) getActivity()).setTitleToosVisible(true);
} else {
//如果长按的是已经选中的,则会取消选中的item,当取消完所有选中则需要退出选择模式
if (currentSelectItems.isEmpty()) {
//退出选择模式
isSelectMode = false;
//隐藏选择模式的页面效果
selectModeToolsLayout.setVisibility(View.GONE);
((MainActivity) getActivity()).setTitleToosVisible(false);
}
}
...