mobile_numen_4
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的时候需要创建新的 任务栈