Android_Phone源代码拨打电话解读

来自陈显的博客 http://www.cnblogs.com/chenxian/ OutgoingCallBroadcaster将在往外拨打电话时被调用,当然执行其onCreate()方法 首先:    mPhone = PhoneApp.getInstance().phone; Intent intent = getIntent(); if (LOGV) Log.v(TAG, "onResume: Got intent " + intent + "."); String action = intent.getAction(); String number = PhoneNumberUtils.getNumberFromIntent(intent, this);//获取到PhoneApp对象,获取Intent,并且取得拨出的号码 然后,对号码进行处理 之后判断是不是紧急号码,如120。。。如果是紧急号码,直接startActivity启动InCallScreen,同时将callNow变量赋值为true  于是InCallScrenn启动唤醒屏幕。。。  而在receiver里面判断callNow为ture就直接finish,而不再重复启动InCallScreen如果不是紧急号码就发送广播“Intent.ACTION_NEW_OUTGOING_CALL”,让别人进行处理   broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow); broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, intent.getData().toString()); if (LOGV) Log.v(TAG, "Broadcasting intent " + broadcastIntent + "."); sendOrderedBroadcast(broadcastIntent, PERMISSION, null, null, Activity.RESULT_OK, number, null);广播发送后OutgoingCallReceiver将会收到**********************************OutgoingCallReceiver******************************************本类是一个内部类,在类 OutgoingCallBroadcaster 里面,作用是接受OutgoingCallBroadcaster发送的广播,判断是否已经启动InCallScreen,没有启动的话就进行一些初始化,如:对OTA进行初始化。然后启动InCallScreen。接收到广播之后,从Intent里面取出电话号码及其URi  originalUri = intent.getStringExtra( OutgoingCallBroadcaster.EXTRA_ORIGINAL_URI);然后,设置Intent为ACTION_CALL,并带上号码和uri并从Intent中取出callnow变量,  如果为ture,表示在OutgoingCallBroadcaster中已经把InCallScrenn启动,所以不需要重复启动,而是直接把自己给finish 如果为false,表示不是紧急号码,并且InCallScrenn没有被启动,所以需要将InCallScrenn启动,如下:     Intent newIntent = new Intent(Intent.ACTION_CALL, uri); newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number); newIntent.setClass(context, InCallScreen.class); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(newIntent);并且启动对应的Activity **************************InCallScreen**********************************  该类extends了Acitivity,并且implements了OnClickListener和OnTouchListener,  所以该类主要是负责打电话的那一个界面,并且还负责各种按键事件和触摸时间的处理。同时本类还复写的finish()方法,所以一般不会被finish掉,调用这个方法时它又把自己放回栈中。 InCallScreen可以接收这个Intent并启动。。  在onCreate里面将各个view加载。  在onResume里面进行一些初始化操作,如:获取一个PhoneApp对象 解开Keyguard Notification的statusBar给DIsable。。。。  还内置了一个Handler可以回调处理一些事件,比如: PHONE_STATE_CHANGED ;PHONE_DISCONNECT ;     EVENT_HEADSET_PLUG_STATE_CHANGED    同时有一个独立的BroadcastReceiver处理ACTION_HEADSET_PLUG,比如插入耳机等。。。。 **********************************PhoneApp*******************************************该类是一个普通的java类,主要负责Phone对象的生成 这是一个虚拟的Phone对象,它从framework层取得一个Phone对象。该类继承自Application,同时能常驻内存他和PhoneUtils一起处理电话操作 在oncreate方法里面进行各种全局的初始化:获取Phone对象 NotificationMgr对象 PowerManager对象 SimCard对象等。。。 同时内置的Handler可以回调处理各种事件,如:EVENT_SIM_ABSENT EVENT_SIM_NETWORK_LOCKED EVENT_UPDATE_INCALL_NOTIFICATION等。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值