Android零碎知识

简介:   Android零碎知识 分类: android  一、android:stopWithTask 用于 可在 R.attr 中找到,有两个疑惑:         1、为啥在R.
 

Android零碎知识

分类: android 

一、android:stopWithTask 用于 <service> 可在 R.attr 中找到,有两个疑惑:

        1、为啥在R.attr中找到?它里面不都是Resource的ID吗.

        2、不知道这个标签对 service 有什么影响

二、LinearLayout 有一个 android:gravity 属性用于设置其内部 view 摆放方式,如 垂直居中、水平居中等

三、

TextUtils.isEmpty(mSearchString)
检查一个字符串是否为空,注意 TextUtils 工具类的使用

四、Java Exception 是不跨线程的, 有时间仔细研究下

 
 

五、 ContentUris 工具类有时间仔细看下文档/ Uri 有时间仔细看下文档/ UriBiulder/

六、View --> TextView --> EditView 这个文档要看

七、

[java]  view plain copy
  1. SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
  2. Cursor c = qb.query(db, projection, selection, selectionArgs, nullnull, mySortOrder);  
  3. //Cursor ContentResolver Uri 之间的关系是什么  
  4. c.setNotificationUri(getContext().getContentResolver(), uri);  
  5. return c;  
[java]  view plain copy
  1. long rowId = db.insert(NOTES_TABLE_NAME, null, contentValues);  
  2. if(rowId > 0) {  
  3.     Uri newUri = ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);  
  4.         //这里的 ContentResolver.notifyChange(Uri,null)做了什么工作?  
  5.         //和 Cursor.setNotificationUri()有什么关系  
  6.         getContext().getContentResolver().notifyChange(newUri, null);  
  7.     return newUri;  
  8. else {  
  9.     // android.database.SQLException  
  10.     throw new SQLException("Failed to insert row into " + uri);  
  11. }  

在实现 ContentProvider 的query 时,一般都有下面几行代码:

[java]  view plain copy
  1. SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
  2. Cursor c = qb.query(db, projection, selection, selectionArgs, nullnull, mySortOrder);  
  3. //这一行的代码的作用?  
  4. c.setNotificationUri(getContext().getContentResolver(), uri);  
  5. return c;  
下面具体说下注释的那行的作用?
从字面上看 setNotificationUri, 即 Uri 有改变时对本 Cursor 发出通知.
查看 AbstractCursor.setNotificationUri 源代码如下:

[java]  view plain copy
  1. public void setNotificationUri(ContentResolver cr, Uri notifyUri) {  
  2.     mContentResolver = cr;  
  3.     mNotifyUri = notifyUri;  
  4.     mSelfObserver = new SelfContentObserver(this);  
  5.     //cr.registerContentObserver(notifyUri, mSelfObserver)  
  6.     mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver);  
  7. }  
这个方法的作用就是在 ContentResolver上注册一个 Observer,

当 ContentResolver.notifyChange 时将调用已经注册的 ContentObserver, 你可以通过调用 ContentResolver.registerContentObserver 明确的给 ContentReselover注册观察者,
在这里我们并没有明确的调用 registerContentReselover方法, 而是通过 Cursor.setNotificationUri 间接的注册了一个 ContentObserver.

这个间接注册的好处是什么呢?
间接注册时的 ContentObserver 是 AbstractCursor的一个内部类, 这个以内部类形式存在的 ContentObserver把 AbstractCursor关联进去.

总体上的过程为:

[java]  view plain copy
  1. //这个 Cursor 会被 Context.getContentResolver().query() 返回  
  2. Cursor c = SQLiteDatabase.query();  
  3. // 在 ContentResolver上注册一个 ContentObserver  
  4. c.setNotificationUri(ContentResolver,Uri)  
  5. //如果ContentObserver参数为null, 则ContentResolver会通知上一步注册的ContentObserver  
  6. getContentResolver().notifyChange(Uri,ContentObserver)  
  7. //Abstract Cursor 源码中的 setNotificationUri方法下的  
  8. new SelfContentObserver(this//会获得ContentResolver发出的通知  
SelfContentObserver会通知和其关联的Cursor(初始化SelfContentObserver时进行关联)
Cursor会调用 onChange 通知自己的 ContentObserver. 其中默认的 ContentObserver是 CursorAdapter
也就是说 Cursor 也有 ContentObserver, 而它的默认 ContentObserver是在这个时候设立的:

[java]  view plain copy
  1. //在这个构造数内会设置 Cursor 的观察者为 CursorAdapter,具体可以查看源代码跟踪一下  
  2. SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.notes_list_item,   
  3.                 c/* 指Cursor */new String[]{NotePad.Notes.TITLE}, new int[]{R.id.text1});  
另外Uri参数的用处没有搞太清楚,但总体上是:
content://com.example.notepad/notes/5 这种Uri也会引起 content://com.example.notepad/notes 这种Uri的改变

八、Menu下面的一个方法:

[java]  view plain copy
  1. int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics,Intent intent, int flags, MenuItem[] outSpecificItems);  
这个方法中的第六个参数 intent, 一般Action为null, 并且设置Data为当前Activity相关的,同时包含Category为CATEGORY_ALTERNATIVE或CATEGORY_SECOND_ALTERNATIVE. (如果一个Activity的<intent-filter>声明为CATEGORY_ALTERNATIVE则这个Activity可以在另一个Activity的Options Menu中出现)

解释这个方法的几个参数含义:

groupId: 如果有多外intent-filter满足 intent,则会出现多个 MenuItem,这些MenuItem都属于这个 groupId

itemId: 

order:

ComponentName: 此菜单属于的那个 Activity

specifics: 如果有多外intent-filter满足intent, 则specifics指定了它们的顺序

flags: 

outSpecificItems: 对应 specifics的menuItem


九、public boolean onOptionsItemSelected(MenuItem item)

这个方法的返回值应该特别的注意, 如果返回true, 则系统不会再处理后续事情. 在一些情况下是不能返回 ture的, 如你在 onCreateOptionsMenu 方法中调用 Menu.addIntentOptions 方法生成菜单项, 当这个菜单项被点击时后续的处理应该由系统完成,如果你返回 true,那么系统就不再处理后续流程.


十、

TextView 属性:
android:ems 指TextView的宽可以容纳25个英文字符
android:autoText 使此TextView可以纠错

十一、

可以在 layout.xml 文件中这样使用你自己定义的组件

[html]  view plain copy
  1. <view xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     class="com.example.android.notepad.NoteEditor$LinedEditText"  
  3.     android:id="@+id/note"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:background="@android:color/transparent"  
  7.     android:padding="5dip"  
  8.     android:scrollbars="vertical"  
  9.     android:fadingEdge="vertical"  
  10.     android:gravity="top"  
  11.     android:textSize="22sp"  
  12.     android:capitalize="sentences"  
  13. />  
当然也可以这样使用:

[html]  view plain copy
  1. <com.example.android.notepad.NoteEditor$LinedEditText xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:id="@+id/note"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="@android:color/transparent"  
  6.     android:padding="5dip"  
  7.     android:scrollbars="vertical"  
  8.     android:fadingEdge="vertical"  
  9.     android:gravity="top"  
  10.     android:textSize="22sp"  
  11.     android:capitalize="sentences"  
  12. />  
相关文章
|
API Android开发
Android零碎知识点-更新中
Android零碎知识点-更新中
73 0
|
Android开发 API
Android零碎知识点
1 ViewStub的使用 参考资料: 这里有一系列的实战技巧,可以看看http://blog.csdn.net/hitlion2008/article/details/6737537 中文API:http://www.
892 0
|
XML Android开发 数据格式
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
4天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
8天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
71 19
|
2月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
75 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。

热门文章

最新文章