关于广播需注意的几点:
以发送intent为例,发送广播都用
1, Intent intent = new Intent();intent.setAction(ACTION1);
2, sendBroadcast(intent);
静态注册接收的时候,某一个类A继承BroadcastReceiver
1, 得到action,如:String action = intent.getAction();
2, 判断action类型,做出相应的动作 action.equals(ACTION1);
3, 在AndroidManifest.xml中静态注册广播
<Receiver android:name = “A”>
<intent-filter>
<action android:name =”ACTION1”/>
</intent-filter>
</receiver>
动态注册接收的时候,new 一个广播BroadcastReceiver br = new BroadcastReceiver();
1,在onStart() 或者onCreat()中动态注册广播
(1) IntentFilter intentFilter= new IntentFilter();
(2)intentFilter.addAction(ACTION1);可以添加多个
(3)注册接收,registerReceiver(br,intentFilter);
别忘了在其他需要的地方取消注册接收!!!unregisterReceiver(br);
(4)得到action,如:string
action = intent.getAction();
(5)判断action类型,做出相应的动作action.equals(ACTION1);
=====================================================================================================
service需注意的几点:
MyService类中继承Service
1, 类MyBinder继承Binder类,在该中处理需要service传递的值
2, 在onBind()方法中返回MyBinder
Acitivity中
1, new一个ServiceConnection,在ServiceConnection()方法中绑定IBinder,在onServiceDisconnected()中设置Service为空
2, this.bindService(Intent service, ServiceConnceion conn, int flags);
3, 在onDestroy()中解除绑定this.unbindService(sc);
=========================================================================================================
面试题目:
最近在面试的时候遇到一道题,在activity中有findViewById(R.id.name);这个name需要在运行的时候才知道,现在需要实现一个getString(R.String.name)这样的功能,方法如下:
public static String getValue(String key)。
这个相当于对于<string name="hello">Hello</string>提供了key = hello.问如何得到value值Hello。从这道题看需要用反射,但由于我很少用反射,也没有研究过xml的反射机制,这道题就蒙了,后来查了半天资料是用的dom4j来解析xml,然后把key和value值放到一个hashmap中,这样就可以通过key值取到value值了。但是这样的方法有一个缺陷是当xml很大的时候这个方法就很影响效率了。下来后我才发现最简单也最有效的方法应该是:
Field f;
Class clazz = R.string.class;
try {
f = clazz.getDeclaredField("hello");
String value = getString(f.getInt(R.string.class));
System.out.println("value:"+value);
}
catch () {
}
这样三步就搞定了。
还有一道数学题:
已知一个圆的圆心和半径,还一直一个线段的两个端点,问怎么知道这个线段有没有与圆相交。我就不想说我是数学专业的并且在面试中各种考虑不周到了。
现在想想觉得下面这种方法应该比较简单:
端点A与B是已知的,假设A(x1,y1) B(x2,y2)且x1<x2,y1<y2。现在用A B端点得到直线的方程,然后用圆的方程和直线的方程求相交点。如果没有相交点,说明线段和圆不相交;
如果有相交点一个,假设相交点为M(x,y),如果x1<= x <=x2,y1<= y <=y2,那么线段与圆相交。相交点为两个时,只要有一个点满足上面的条件就表示相交。