• 获取Fragment的context:
   getActivity().getApplicationContext()或者getActivity()You can use getActivity(), which returns the activity associated with a fragment.The activity is a context (since Activity extends Context).
  • 设置TextView的颜色setTextColor()的用法:
 setTextColor(0xff999faa);setTextColor(Color.parseColor("#999faa"))
  • Android textView 动态设置字体大小,带单位:
setTextSize(TypedValue.COMPLEX_UNIT_PX,22);
setTextSize(TypedValue.COMPLEX_UNIT_SP,22);
setTextSize(TypedValue.COMPLEX_UNIT_DIP,22);
  • 初始化一个ArrayList<>并赋值:
ArrayList<String> list = new ArrayList<String>() {{add("string1"); add("string2"); add("string3");}}
  • setBackgroundDrawable和setBackgroundResource的区别:
setBackgroundXXX的用处,设置View背景。
setBackgroundDrawable的参数为Drawable对象。
setBackgroundColor的参数为Color对象,比如说Color.Red为红色或  Color.rgb(255,0,0)来指定一个红色
setBackgroundResource的参数为资源ID,比如说R.drawable.icon对于ImageView类有类似 setImageXXX
道理同上,setImageBitmap的参数为Bitmap对象,同时ImageView还支持矩阵对象,比如setImageMatrix的参数为Matrix对象。
  • Android延时执行接口:
new Handler().postDelayed(new Runnable(){@Overridepublic void run() {func();}
}, 250);
  • 查看Android系统服务命令:
adb shell service list
  • Activity有三种基本状态:
  • Active:处于屏幕前景(当前task的栈顶Activity处于Active状态),同一时刻只能有一个Activity处于Active状态。
  • Paused状态:处于背景画面画面状态,失去了焦点,但依然是活动状态。
  • Stopped:不可见,但依然保持所有的状态和内存信息。
  • 同一个Service的类在android中可以有多个实例吗?
    不可以。Service的启动模式决定它不会在系统中存在多个实例,当有新的Intent传递过来的时候,android系统会直接使用已经存在的Service实例而不会重新创建,所以在android系统中的Service都是单例的。

但为什么在锤子手机上有好几个xstate service???

  • android继承activity和application有什么不同:
    初学安卓,看到有些代码继承activity,有些继承application,不知有什么?
    Activty是UI界面的抽象,Application是应用程序的抽象。一个Application有若干个Activity组成。一般继承Application主要是做一些初始化以及获取全局Context的引用,每个用户界面都要继承自Acitivity。

  • Fragment中调用startActivityForResult:
    注意要采用fragment的startActivityForResult,而不要通过activity调用,否则activity的onActivityResult回被回调,fragment不会被调用,这样start和onResult就分离了。
    目前还没有遇到这个问题,先收藏着
    彻底搞懂startActivityForResult在FragmentActivity和Fragment中的异同
    浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

  • 去除字符串中的标点符号

public static String removePunct(String s) {String str = s.replaceAll("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?|-]", "");str = str.replace("\"", "");return str;
}
  • 判断字符串中是否都是中文字符
public static boolean isChinese(String string) {String regex = "^[\u4E00-\u9FA5]+$";Pattern pattern = Pattern.compile(regex);Matcher match = pattern.matcher(string);return match.matches();}
  • 令人厌恶的Bundles

摘录自Android 中 EventBus 的使用(2):缓存事件

“我在上一篇文章中曾说过,我并不喜欢Android中的Bundle,而且尽量避免使用它们。我不喜欢被象Serializable或者是Parcelable这类对象所约束,尤其是它们还缺少对类型安全的检查。我的意思是必竟这是Java,而不是Python或者Javascript什么的。我希望我的IDE能够发现并告诉我这样的错误,如一个组件向另外一个组件发送了一个不是它期望的对象类型。
不要误会,Intent在进程间通信时还是很有用的,在这种情况下将携带的数据序列化成通用格式是合情合理的。但如果仅仅是为了在用户旋转了一下屏幕后,让程序保持原来的状态,以科学的名义说,有必要非得用这种方法么?没错,我说的就是Android提供的处理配置改变的标准模式——在onSaveInstanceState(Bundle bundle)和onRestoreInstanceState(Bundle bundle)中保存和恢复状态数据。且不提那些荒唐复杂的Fragment生命周期问题,单单是保持运行状态的这种处理方式就是我最不喜欢的Android开发特点之一。”

刚刚遇到了类似问题:Parcel android.os.Parcel@dbaf03f: Unmarshalling unknown type code 2131625126 at offset 1308 导致了crash

XXXX info = mXXXXList.get(position);
if (info == null) {return;
}
Intent intent = new Intent(XXXXActivity.this, XXXXActivity.class);
intent.putExtra(XXX.KEY_SOUND_INFO, info);if (intent != null) {mXXXX = (XXXX) intent.getSerializableExtra(XXX.KEY_SOUND_INFO);
}

由于Serializable导致的问题,出现几率比较小,目前还没找到原因。

  • AsyncTask, Loader和Executor…… 拜托!

摘录自Android 中 EventBus 的使用(3):多线程事件处理

Android中有很多种执行异步操作的方法(指平行于UI线程的)。AsyncTask对于用户来说是最简单的一种机制,并且只需要少量的设置代码即可。然而,它的使用是有局限的,正如Android官方文档中所描述的:

AsyncTask被设计成为一个工具类,在它内部包含了Thread和Handler,但它本身并不是通用线程框架的一部分。AsyncTask应该尽可能地被用在执行一些较短的操作中(最多几秒)。如果你需要在线程中执行较长时间的任务,那么建议你直接使用java.util.concurrent包中提供的各种API,如Executor、 ThreadPoolExecutor以及FutureTask。

不过即便是执行短时间的操作也会带来一些问题,特别是在与Activity/Fragment生命周期有关的地方。由于AsyncTask会持续地运行下去(即使启动它们的Activity/Fragment已经被销毁了)。这样,一旦你在onPostExecute方法中试图对UI进行更新,那么最终将导致抛出一个IllegalStateException异常。

Android 3.0中引入了Loader API用来解决Activity/Fragment生命周期的问题(它们的确很有效)。Loader API被设计成向Activity/Fragment中以异步方式加载数据。尽管加载数据是一种非常常见的异步操作,但并非唯一一种需要从UI线程中分开的操作。Loader还需要在Activity/Fragment中实现另外一个监听接口。尽管这么做没有错,但我个人并不喜欢这种模式(我的意思是最终你的代码中会包含许多的回调函数,导致代码的可读性变得很差)。最后,Activity和Fragment也并非唯一需要对异步操作分线程的地方。例如如果在Service里,你就不能访问LoaderManager,所以最终你还是得使用AsyncTask或者java.util.concurrent。

java.util.concurrent包很不错,我在Android和非Android项目中都可以使用。不过使用时需要对其进行多一点儿配置和管理,不象AsyncTask那么简单。你需要对ExecutorService进行初始化,管理和监视它的生命周期,并且可能需要跟一些Future对象打交道。

只要使用恰当,AsyncTask、 Loader和Executor都是非常有效的。但在复杂应用中,需要为每个任务选择合适的工具,最终你可能三种都会用到。这样你就得维护三种不同的处理并发的框架代码。

  • RelativeLayout布局内组件设置居中
    备忘
android:layout_centerVertical="true"
  • 设置渐变色的背景
    设置背景色可以通过在res/drawable里定义一个xml,如下:
xxx.xml<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><item><shape><gradientandroid:angle="0"android:endColor="#28d5fa"android:startColor="#0083fa"android:type="linear" /></shape></item></layer-list>

引用:

<RelativeLayoutandroid:id="@+id/va_voice_print_step_ll"android:layout_width="match_parent"android:layout_height="149dp"android:background="@drawable/xxx">
</RelativeLayout>

shape:定义形状(主要包括方形、圆形等);gradient:定义该形状里面为渐变色填充;startColor:起始颜色;endColor:结束颜色;angle:表示方向角度。(当angle=0时,渐变色是从左向右。 然后逆时针方向转,当angle=90时为从下往上)。

gradient主要配置起点颜色、终点颜色、中间点的坐标、中间点的颜色、渐变角度(90度为上下渐变,0为左右渐变);
padding主要配置上下左右边距;
corners节点配置四周园角的半径;
参考链接:Android (shape,gradient)使用总结,android 背景渐变色(shape,gradient)

  • 如果在Android中判断某个线程是否是主线程?
public static boolean isInMainThread() {return Looper.myLooper() == Looper.getMainLooper();
}
  • EditText中灰色文字提示
android:hint="请输入xx"
  • 如何查看Activity Task栈的情况
adb shell dumpsys activity activities
adb shell dumpsys activity top
  • 打开app对应设置通知中心
public void openNotificationSettings() {try {Intent intent = new Intent();intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {intent.putExtra("app_package", context.getPackageName());intent.putExtra("app_uid", context.getApplicationInfo().uid);}intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);} catch (Exception e) {e.printStackTrace();}
}
  • gradle里面的cached module文件位置
~/.gradle/caches/modules-2/files-2.1/com.ali*
  • 判断app是否在前台运行
 public boolean isAppOnForeground() {// Returns a list of application processes that are running on the// deviceActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);String packageName = getApplicationContext().getPackageName();List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();if (appProcesses == null)return false;for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {// The name of the process that this object is associated with.if (appProcess.processName.equals(packageName)&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {return true;}}return false;
}
  • Activity内使用Broadcast接收消息

大部分的Broadcast示例都是新建一个class继承BroadcastReceiver来说明Broadcast的使用,但是这个class中接收到的消息,如何进行后续处理呢?其实大部分情况下是希望在activity中通过Broadcast接收消息,做一些后续的处理工作,而如果在一个新建的继承自BroadcastReceiver的class中,如何和某个Activity通讯,这是一个悖论,消息发生源传递给Broadcast,Broadcast再传递给Activity,后一步要采用什么通讯方式呢?为什么不消息发生源不直接发生消息给Activity呢?

由于大部分示例都是在一个新的class中进行,导致我一度认为Broadcast只能写在class里。后来发现可以通过动态注册的方式直接new一个BroadcastReceiver的方式,写在Activity内部,由于BroadcastReceiver在Activity内部,BroadcastReceiver中onReceive()即可操作Activity内数据和控件,实现Activity接受消息的目的。

private BroadcastReceiver mSearchRequestReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {//do somethings}}};@Overridepublic void onResume() {super.onResume();LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);lbm.registerReceiver(mSearchRequestReceiver, new IntentFilter(SEARCH_REQUEST_BROADCAST_ACTION));}@Overrideprotected void onPause() {super.onPause();LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);lbm.unregisterReceiver(mSearchRequestReceiver);}
  • 判断当前线程是否是Ui线程:
public static boolean isMainThread() {return Thread.currentThread() == Looper.getMainLooper().getThread();
}
  • Glide.with()使用
with(Context context):使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。
with(Activity activity):使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。
with(FragmentActivity activity):Glide的请求会受到FragmentActivity生命周期控制。
with(android.app.Fragment fragment):Glide的请求会受到Fragment 生命周期控制。
with(android.support.v4.app.Fragment fragment):Glide的请求会受到Fragment生命周期控制。
  • HashMap的遍历

从上面的分析来看:
a. HashMap的循环,如果既需要key也需要value,直接用

Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue();
}

即可,foreach简洁易懂。
b. 如果只是遍历key而无需value的话,可以直接用

Map<String, String> map = new HashMap<String, String>();
for (String key : map.keySet()) {// key process
}
  • 自定义view常见问题:

Caused by: java.lang.NoSuchMethodException: [class android.content.Context, interface android.util.AttributeSet]

自定义View时,要同时覆写

public XXXX(Context context) {super(context);
}/*** 自定义View时,如果自定义View有属性,这个方法一定要覆写!!** @param context* @param attrs*/
public XXXX(Context context, AttributeSet attrs) {super(context, attrs);
}
  • Android 文件锁 FileLock
 Android 中 FileLock 只支持进程间死锁,同一进程不同线程是无效的。
  • 判断当前应用是否是debug状态
/*** 判断当前应用是否是debug状态*/
public static boolean isApkInDebug(Context context) {try {ApplicationInfo info = context.getApplicationInfo();return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;} catch (Exception e) {return false;}
}
  • 查询10秒钟前应用使用统计数据并根据最后使用时间进行排序,得到的最后使用的应用
    public static String getTopActivityPackageName(@NonNull Context context) {final UsageStatsManager usageStatsManager = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE);if(usageStatsManager == null) {return PACKAGE_NAME_UNKNOWN;}String topActivityPackageName = PACKAGE_NAME_UNKNOWN;long time = System.currentTimeMillis();// 查询最后十秒钟使用应用统计数据List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);// 以最后使用时间为标准进行排序if(usageStatsList != null) {SortedMap<Long,UsageStats> sortedMap = new TreeMap<Long,UsageStats>();for (UsageStats usageStats : usageStatsList) {sortedMap.put(usageStats.getLastTimeUsed(),usageStats);}if(sortedMap.size() != 0) {topActivityPackageName =  sortedMap.get(sortedMap.lastKey()).getPackageName();Log.d(TAG,"Top activity package name = " + topActivityPackageName);}}return topActivityPackageName;}```

Android应用开发—知识点汇总相关推荐

  1. Android游戏开发教程汇总

    Android游戏开发教程汇总 把最近搜集到的Android游戏开发教程列出来,希望对大家有用. 1.Android2.0游戏开发实战宝典源代码,当然可能大家已经把书也买回家啦. 2.Pro.Andr ...

  2. VS2017 winform开发知识点汇总

    VS2017 winform开发知识点汇总 1 快捷键 2 控键缩写 2.1 标准控件 2.2 容器控件 2.3 菜单和工具栏 2.4 数据 2.5 对话框 2.6 组件 2.7 印刷 2.8 水晶报 ...

  3. Android安卓开发知识库汇总

    初级 Android 面试知识库 Android 面试题总结之Android 进阶(二) - fuchenxuan blog - 博客频道 - CSDN.NET 如何成为一名优秀的程序员 | Myst ...

  4. Android WebView开发问题汇总

    在native与网页相结合开发的过程中,难免会遇到关于WebView一些共通的问题.就我目前开发过程中遇到的问题以及最后得到的优化方案都将在这里列举出来.有些是老生常谈,有些则是个人摸索得出解决方法. ...

  5. Android 安卓开发命令汇总

    文章目录 命令汇总 adb命令 文件管理 重启设备 查看日志 其他 例:刷入apk步骤(SystemUI.apk为例): adb shell命令 查看设备中应用信息 模拟按键输入 查看设备信息 与应用 ...

  6. Android知识点汇总以及常见面试题

    Android知识点汇总以及常见面试题 1. 链表和数组的区别 2. List Hash 数组的区别 3. 用过哪些三方SDK 4. Android四大组件 5. 堆和栈的区别 6. Activity ...

  7. Android知识点汇总,坚持原创ing

    Android基础 语法基础 语法基础--C语法基础 语法基础--C++语法基础 语法基础--Objective-C语法基础 语法基础--PHP语法基础 面试复习 面试复习--Android工程师之J ...

  8. 【Android】知识点汇总,坚持原创ing

    Android基础 RxJava2 0章 RxJava2课程目录介绍 1章 基础概念 2章 RxJava基本使用 3章 RxJava操作符 4章 RxJava基本响应类型 5章 RxJava背压策略 ...

  9. 高级Android开发面试汇总

    高级 Android 开发面试题汇总 一. Android 基础 1. Service 的两种启动方式 简单的来说就是 直接启动 和 绑定启动 两种方式. // 直接启动 Context.startS ...

最新文章

  1. 内存是新的硬盘,硬盘是新的磁带
  2. Python_第一堂课
  3. Vue.js 学习笔记 第5章 内置指令
  4. mysql 做回归模型_GitHub - themycode/intelligent-test-platform: intelligent-test-platform
  5. 服务器连接硬盘出错,在服务器上使物理磁盘资源联机时出错 - Windows Server | Microsoft Docs...
  6. 【渝粤题库】国家开放大学2021春2634推销策略与艺术题目
  7. 前端学习(2655):vue2中用ref实现计算器
  8. Hammer.js分析(三)——input.js
  9. 虚拟键码对照表与ASCII对照表的整理
  10. Linux内核深入理解系统调用(2):vsyscall 和 vDSO 以及程序是如何运行的(execve)
  11. java实现pdf转word,如何使用Java将pdf文件转换为word文件
  12. Qt 给文本添加删除线 text-decoration
  13. db4o and sematicweb
  14. python多行显示_设置图例以多行显示(在python中) - python
  15. 防火墙区域及工作模式
  16. 详解24个经典股票技术指标.doc
  17. [gdc13]《孤岛危机3》渲染技术
  18. oftPerfect RAM Disk 内存盘管理,提高软件速度
  19. quill(vue-quill-editor) 编辑器中莫名多出一行
  20. Google Maps 全球所有国家地名全部中文化,但是……

热门文章

  1. Linux strtol将十六进制转化为十进制
  2. C++ 标准程序库std::string 详解
  3. 科目三靠边停车技巧要领
  4. 人生有五不:不等、不管、不看、不做、不给
  5. 我不知道的事——深克隆和浅克隆
  6. Learn day4 函数参数\变量\闭包\递归
  7. SpringCloud框架搭建+实际例子+讲解+系列五
  8. objectdatasouce的温故
  9. JS内置方法(Array)
  10. R 包的安装,使用,更新