Android坑(2)
6.广播的两种注册方法,有什么区别。
- 静态注册
<receiver android:name=".MyBroadCastReceiver">
<!-- android:priority属性是设置此接收者的优先级(从-1000到1000) -->
<intent-filter android:priority="20">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
- 动态注册
//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();
//实例化过滤器并设置要过滤的广播
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//注册广播
myContext.registerReceiver(smsBroadCastReceiver,intentFilter,
"android.permission.RECEIVE_SMS", null);
- 无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
mContext.sendBroadcast(Intent)
mContext.sendBroadcast(Intent, String) (加了权限);
通过发送的是有序广播。
Intent intent = new Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
sendBroadcast(intent);
//sendBroadcast(broadcast, "andro.jf.mypermission");添加了权限
<permission android:name="andro.jf.mypermission" android:label="my_permission" android:protectionLevel="dangerous"></permission>
- 有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。
mContext.sendOrderedBroadcast(Intent,String,BroadCastReceiver,Handler,int,String,Bundle)
先后顺序由priority决定,在onReceive()调用abortBroadcast()即可中断后续广播。
Intent intent = new Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
//第一个参数:intent
//第二个参数:String类型的接收者权限
//第三个参数:BroadcastReceiver 指定的接收者
//第四个参数:Handler scheduler
//第五个参数:int 此次广播的标记
//第六个参数:String 初始数据
//第七个参数:Bundle 往Intent中添加的额外数据
sendOrderedBroadcast(intent, null, null, null, 0,"这是初始数据", null);
7.Intent的使用方法,可以传递哪些数据类型。
略
- ContentProvider使用方法。
多进程中安全的使用SharedPreferences
注册ContentProvider
<provider>
android:authorities = "...." 授权者
android:name = ".XXXProvider"
android:exported = "true"/>
继承ContentProvider
重写增删改查、getType、onCreate方法
增删改查内部的方法是基于SQLite操作的
SQLteOpenHelper->其构造函数用于创建数据库 eg:SQLiteOpenHelper dbop = new SQLiteOpenHelper(context,数据库名字,null,数据库版本);
->重写其onCreate(SQLiteDatabase db){
db.execSQL("create table(
id integer primary key autoincrement
...)")
}
SQLiteDatabase->通过DatabaseOpenHelper的getWritableDatabase()或getReadableDatabase方法获取数据库实例
一般上述两个初始化写在onCreate中
匹配Uri的方法:
UriMatcher
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addUri(authority,path,自定义参数(随便,到时候对象的match方法会返回这个值));
uriMatcher.match(uri) //返回第三个参数
使用者(ContentResolver)实例 ->相当于集成了ContentProvider的池,通过uri对其特定的ContentProvider进行数据操作
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put(列名,属性值);
. . .
//向ContentProvider添加一条数据
Uri newUri = resolver.insert(uri,values);
//delete()
//查询
Uri uri = Uri.parse("content://com.example.cp/person");
参数 SQL语句
Cursor cursor = getContentResolver().query(uri, from table_name
projection, select column1,column2
selection, where column = value
selectionArgs, 无
orderBy order by column1,column2
)
-
Thread、AsyncTask、IntentService的使用场景与特点。
-
五种布局: FrameLayout 、 LinearLayout 、 AbsoluteLayout 、 RelativeLayout 、 TableLayout各自特点及绘制效率对比。
-
Android的数据存储形式。
-
Sqlite的基本操作。
-
Android中的MVC模式。
-
Merge、ViewStub的作用。
-
Json有什么优劣势。
-
动画有哪两类,各有什么特点?
-
Handler、Loop消息队列模型,各部分的作用。
-
怎样退出终止App。
-
Asset目录与res目录的区别。
-
Android怎么加速启动Activity。
-
Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。
-
Android中弱引用与软引用的应用场景。
-
Bitmap的四中属性,与每种属性队形的大小。
-
View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。
-
Touch事件分发机制。
-
Android长连接,怎么处理心跳机制。
-
Zygote的启动过程。
-
Android IPC:Binder原理。
-
你用过什么框架,是否看过源码,是否知道底层原理。
-
Android5.0、6.0新特性。
31.什么时候会发生OOM
dalvik.vm.heapgrowthlimit
-- 默认情况下, App可使用的Heap的最大值, 超过这个值就会产生OOM.
Android是如何管理App内存的--Android内存优化第二弹