Android应用开发—知识点汇总

  • 获取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;}```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

条件渲染vue

v-if:只渲染一次的情况下&#xff0c;性能更好v-show:频繁切换性能更好 vue虚拟DOM技术 浏览器&#xff1a;渲染引擎&#xff08;慢&#xff09;JS引擎&#xff08;快&#xff09; 用1个JS对象来充当DOM对象&#xff0c;因为JS对象性能比较快&#xff0c;所以用虚拟DOM对象进行…

钱线观察:货币基金T+0驾到 活期存款将死?

导语&#xff1a;即使没有任何投资风险&#xff0c;通胀也在侵蚀居民的财富&#xff0c;现金是不安全的。最近出现的一项业务&#xff0c;货币基金"T0"赎回&#xff0c;意味着货币基金可以像活期存款一样即时取现&#xff0c;而其收益率普遍高于活期存款。因此有人认…

git stash和git stash pop

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 git stash 可用来暂存当前正在进行的工作&#xff0c; 比如想pull 最新代码&#xff0c; 又不想加新commit&#xff0c; 或者另外一种情…

CentOS 7.0 上安装和配置 VNC 服务器

作为一个系统管理员&#xff0c;大多数时间是通过网络管理服务器的。在管理服务器的过程中很少会用到图形界面&#xff0c;多数情况下我们只是用 SSH 来完成我们的管理任务。在这篇文章里&#xff0c;我们将配置 VNC 来提供一个连接我们 CentOS 7 服务器的方法。VNC 允许我们开…

Android应用开发—TextView的动态创建

动态创建TextView的两种方式&#xff1a; 下面介绍两种创建方式&#xff1a; 在drawable里面创建共同依赖的background.xml文件&#xff0c;里面设置shape来设置文本框的一些特殊效果&#xff1a; eg&#xff1a; <?xml version"1.0" encoding"utf-8"…

Mongo DB 简单搭建和部署

1.先下载源代码包 官网下载地址&#xff1a;http://www.mongodb.org/downloads 2.解包tar xf mongodb-linux-x86_64-rhel62-3.2.7.tgz 3.把包移动到 /usr/local/mongodb mv mongodb-linux-x86_64-rhel62-3.2.7/ /usr/local/mongodb 指定同一时间最多可开启的文件数&#xff08…

运算符优先级 必熟记,放到心里

优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 &#xff08;表达式&#xff09;/函数名(形参表) . 成员选择&#xff08;对象&#xff09; 对象.成员名 -> 成员选择&#xff08;指针&#xff0…

可持久化平衡树(FHQ Treap)

两个最基本的操作 merge合并 split分割 merge 把两棵treap合并成一棵treap&#xff0c;要满足T1最大值要比T2最小值小&#xff0c;比较将随机数值key值更大的作为合并后的根 假设T1作为根节点作为新子树的根&#xff0c;左子树不变&#xff0c;右子树对T1原来的右子树与T2再递归…

Git 分支管理-git stash 和git stash pop

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 合并分支&#xff0c;冲突是难免的&#xff0c;在实际协作开发中我们遇到的情况错综复杂&#xff0c;今天就讲两个比较重要的命令使用gi…

useState语法讲解

useState语法讲解 语法定义 const [state, dispatch] useState(initData)state&#xff1a;定义的数据源&#xff0c;可视作一个函数组件内部的变量&#xff0c;但只在首次渲染被创造。dispatch&#xff1a;改变state的函数&#xff0c;推动函数渲染的渲染函数。dispatch有两…

NSOperation的进阶使用和简单探讨

本文将会从多个方面探讨NSOperation类和NSOperationQueue类的相关内容 一、简介 NSOperation类是iOS2.0推出的&#xff0c;通过NSThread实现的,但是效率一般。 从OS X10.6和iOS4推出GCD时&#xff0c;又重写了NSOperation和NSOperationQueue&#xff0c;NSOperation和NSOperati…

Android应用开发—LayoutParams的用法

Android应用开发—TextView的动态创建 这篇文章讲到了“TextView控件布局位置的控制”&#xff0c;主要依赖于RelativeLayout.LayoutParams的使用&#xff0c;本文简单介绍下LayoutParams的用法 注&#xff1a;本文大部分内容参考android,利用layoutParams代码动态布局空间位置…

廖雪峰Java1-2程序基础-7布尔运算符

布尔运算符 关系运算符&#xff1a;>&#xff0c; >&#xff0c; <&#xff0c; <&#xff0c; &#xff0c;!与运算 &&或运算 |非运算 &#xff01;int n 5;boolean t n > 0;//trueboolean f n < 0;//falseboolean isFive n 5;//trueboolean i…

第二十一届国际C语言混乱代码大赛结果公布

摘要&#xff1a;国际C语言混乱代码大赛&#xff08;IOCCC, The International Obfuscated C Code Contest&#xff09;是一项著名的国际编程赛事&#xff0c;从1984年开始到2006年&#xff0c;每年举办一次。2006年后中止了多年&#xff0c;2011年又开始恢复。比赛的目的是写出…

QuartZ Cron表达式

CronTrigger 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日历的概念&#xff0c;而非SimpleTrigger完全指定的时间…

maven02-----Maven项目构建的初次使用

一. 创建Maven项目 1.1 建立一个Hello项目 当然也可以通过java project的方式创建符合Maven约定的目录结果的项目&#xff0c;并手动建立pom.xml文件&#xff0c;但是太繁琐了。因此&#xff0c;这里直接建立maven项目。note: eclipse有内建的maven项目创建功能&#xff0c;倘若…

微软超过苹果 成为全球第一大市值公司

11月23日周五盘中至收盘&#xff0c;微软市值正式超过苹果&#xff0c;成为世界上市值最高的公司。收盘时&#xff0c;微软市值为7533.4亿美元&#xff0c;苹果市值为7468.2亿美元&#xff0c;亚马逊市值为7366.2亿美元&#xff0c;谷歌市值为7255.2亿美元。 上次苹果与微软市值…

创新大赛成就创业梦想 超30%入榜应用获投资意向

摘要&#xff1a;腾讯开放平台宣布移动应用赛区正式开启&#xff0c;新一轮的创业梦想正在成长中。据悉&#xff0c;在腾讯开放平台应用创新大赛中诞生了多款DAU&#xff08;日活跃用户数&#xff09;超百万的应用。小鱼吃吃吃、开心泡泡猫等引领社交游戏潮流&#xff0c;视频达…