1, 全屏显示
2, 判断sdk是否有用
3, ProgressDialog进度条的显示
5,菜单(Menu)
6, 搭建单元测试的环境
7, 程序自动挂断电话
8, 删除 通话记录
9, 开辟了一个新的任务栈
1, 全屏显示
当播放Splash动画的时候通常把屏幕设置成全屏:
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
2, 判断sdk是否有用
为了是程序更加严严谨和健壮,我们一般读或者往SDK里面写数据的时候要判断手机的SDK是否可用,当然不要忘了加权限.
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
.....
}
3, ProgressDialog进度条的显示
一般先把它show出来,然后执行下载.如下面下载范例:
public static File downLoad(String path,ProgressDialog pd) throws Exception{
//判断sd卡是否可用
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//根据sdk的路径和文件的名称构建File对象
File file = new File(Environment.getExternalStorageDirectory(),getFileName(path));
URL url = new URL(path);
//通过URL连接服务器上的资源
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置连接超时的时间
conn.setConnectTimeout(5000);
//返回资源的大小
int max = conn.getContentLength();
//设置ProgressDialog总大小
pd.setMax(max);
InputStream is = conn.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len=0;
int total =0 ;
//把从服务器上的资源写到sdk上
while((len = is.read(buffer))!=-1){
fos.write(buffer, 0, len);
total+= len;
//设置ProgressDialog进度
pd.setProgress(total);
}
fos.flush();
fos.close();
is.close();
return file;
}else {
return null;
}
}
4,android:layout_gravity和android:gravity的区别
前者是作用于他的子元素,后者作用他的文本.
5,菜单(Menu)
详见:http://www.cnblogs.com/johnny901114/archive/2012/02/08/2342833.html OptionsMenu的创建的两种方式
其实 ContextMenu创建方式也是类似,如:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.blacknumbernenu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case R.id.item_blacknumber_add:
Log.i(TAG, "当前点击的条目为 " + info.id);
addblacknumber();
break;
case R.id.item_blacknumber_delete:
Log.i(TAG, "删除的条目为 " + info.id);
String number = numbers.get((int) info.id);
dao.delete(number);
// 刷新方式1.重新设置数据适配器 导致全部数据发生刷新
// numbers = dao.findall();
// lv.setAdapter(new ArrayAdapter<String>(this,
// R.layout.black_number_item, R.id.tv_black_number_item,numbers));
// 刷新方式2. 告诉listview 数据发生了改变
numbers = dao.findall();
// 拿到数据适配器,告诉数据适配器 数据发生改变
// 通过notifyDataSetChanged刷新的方式,刷新后不会跳到第一个条目(item)
adapter.notifyDataSetChanged();
break;
}
return super.onContextItemSelected(item);
}
注意系统提供的Adapter不能实现刷新功能.
6, 搭建单元测试的环境
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.johnny.xxx" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" />
.......
7, 程序自动挂断电话
程序挂断电话.系统把这个功能隐藏掉了,需要使用aidl., 不要忘了加上权限:android.permission.CALL_PHONE
第一 ,加上两个aidl文件:
第二 假设定义一个broadcast Receiver
public class BlackNumberReceiver extends BroadcastReceiver {
// 如果是拨打电话
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
......
}else {
// 如果是来电
TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;// 标识当前是来电
incoming_number = intent.getStringExtra("incoming_number");
BlackNumberDao dao = new BlackNumberDao(context);
if (dao.find(incoming_number)) {
// 挂断电话
endcall();
// 删除未接记录
// Register an observer class that gets callbacks
// when data identified by a given content URI changes.
context.getContentResolver().registerContentObserver(
CallLog.Calls.CONTENT_URI, true, new CallLogChangeObserver(new Handler(),incoming_number,context));
}
Log.i(TAG, "RINGING :" + incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if (incomingFlag) {
Log.i(TAG, "incoming ACCEPT :" + incoming_number);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (incomingFlag) {
Log.i(TAG, "incoming IDLE");
}
break;
}
}
endcall()方法:
private void endcall() {
// 反射获取系统的电话的服务
try {
Method method = Class.forName("android.os.ServiceManager")
.getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null,
new Object[] { Context.TELEPHONY_SERVICE });
ITelephony mService = ITelephony.Stub.asInterface(binder);
mService.endCall();
} catch (Exception e) {
e.printStackTrace();
}
}
8, 删除 通话记录
// 挂断电话
endcall();
// 删除记录
// Register an observer class that gets callbacks
// when data identified by a given content URI changes.
//注册ContentObserver 当content uri的数据发生调用onChange(boolean)方法
context.getContentResolver().registerContentObserver(
CallLog.Calls.CONTENT_URI, true,
new CallLogChangeObserver(new Handler(),incoming_number,context));
private class CallLogChangeObserver extends ContentObserver {
private String blacknumber;
private Context context;
public CallLogChangeObserver(Handler handler,String blacknumber,Context context) {
super(handler);
this.blacknumber = blacknumber;
this.context = context;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
/*//方式1: 首先查询出来 这个blacknumber在数据库中的id
Cursor cursor = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI, new String[] { "_id" },
"number=?", new String[] { blacknumber }, null);
if (cursor.moveToFirst()) {
// 根据这个id删除 呼叫记录
context.getContentResolver().delete(CallLog.Calls.CONTENT_URI, "_id=?",
new String[] { cursor.getInt(0) + "" });
}*/
//方式2: 根据号码直接删除
context.getContentResolver().delete(CallLog.Calls.CONTENT_URI, "number=?", new String[]{blacknumber});
//删除黑名单号码通话记录后 取消内容观察者
//因为只有来电是黑名单的电话记录才删除
//如果非黑名单来电就不能删除,所以取消观察者
context.getContentResolver().unregisterContentObserver(this);
}
}
9, 开辟了一个新的任务栈
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(lostprotectedintent);
如broadcast Receiver没有上下文,所以启动activity的时候需要创建新的 任务栈