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

  

转载于:https://www.cnblogs.com/johnny901114/archive/2012/02/08/2343336.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值