SMS送信-SMS送信プロセス-アプリケーション層
Sms Sending Sms Sending Process Application Layer
2019 Unicorn Enterprise Heavy Gold Recruitment Python Engineer Standard >>>
SMS送信プロセスアプリケーション層分析1、関係するクラス
[プレーン] プレーンビュー コピー- com.android.mms.ui.ComposeMessageActivity
- com.android.mms.data.WorkingMessage
- com.android.mms.transaction.MessageSender
- com.android.mms.transaction.SmsMessageSender
- com.android.mms.transaction.SmsSingleRecipientSender
- com.android.mms.transaction.SmsReceiverService
- com.android.mms.transaction.SmsReceiver
3、プロセス分析
3.1ComposeMessageActivityの作業
このクラスは、以下に示すように、SMSを編集し、ユーザーと対話するUIです。
ユーザーが編集を終了したら、送信ボタンをクリックしてメッセージの内容を送信できます。 sendbuttonをクリックすると、ボタンの対応するリスナーがトリガーされます。 ComposeMessageActivityはOnClickListenerインターフェースを実装しているため、最終的にonclickメソッドに呼び出されます。
1)onClick分析
このメソッドは2つのことを行います。
最初に、isPreparedForSendingメソッドが呼び出され、現在のショートメッセージを送信する準備ができているかどうかが判別されます。基本は、ショートメッセージの受信者が許可された上限を超えているかどうか、受信者がいるかどうか、ショートメッセージにコンテンツや添付ファイル、テーマなどがあり、ユーザーが何も送信できないかどうかです。 。テキストメッセージは送信されません。
次に、上記のチェックは、confirmSendMessageIfNeededメソッドを呼び出すことによって送信プロセスを開始します。もちろん、このメソッドは正常に送信されません。また、このメソッドは、要件を満たすまで一連のチェックも実行します。
二)確認SendMessageIfNeeded分析
このメソッドの論理呼び出しを以下に示します。
3)sendMessageメソッドの分析上の図は、最後にsendMessageに移動する必要があることを示しています。このメソッドが何をするか見てみましょう。コードを見ると、最も重要な作業は次のとおりです。SMSをWorkingMessageに送信する作業を引き渡す、mWorkingMessage.send(mDebugRecipients)その他の作業は、補助的な操作を行うことだけです。概要:この時点までテキストメッセージを送信する作業は、WorkingMessageに渡され、その後ComposeMessageActivityの主な仕事は、デュアルカードの処理です。
3.2WorkingMessageの簡単な分析
1)send()分析このメソッドは5つのことを行います。1つは、受信者リストが空かどうかを確認することです。ここでは特定の分析は行いません。 2つ目は、SMSコンテンツを8バイトから7バイトに変換することです。3つ目は、現在のMMSが送信されているかどうかを判断することです。現在SMSメッセージを送信しているため、MMS送信プロセスを実行できません。第4に、SMSの署名をSMSのコンテンツに追加します。 5つは、preSendSmsWorker()メソッドを呼び出すことです。 2)preSendSmsWorker分析1つはインターフェイスをリセットし、インターフェイス上のすべてのコンポーネントをクリアすることです。2つ目はsendSmsWorkerメソッドを呼び出すことです。3つ目はドラフトを削除することです。 3)sendSmsWorker()によって実行される作業SmsMessageSenderのsendMessage()メソッドを呼び出します3.3SmsMessageSender分析
1)sendMessage()このメソッドは、queueMessage()メソッドを呼び出して、処理のために送信されたタスクをスローします。
二)queueMessage() それには2つの責任があります。 1つは、データベースに送信するショートメッセージを保存することです。 [プレーン] プレーンビュー コピー- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext)
- boolean requestDeliveryReport = prefs.getBoolean(
- MessagingPreferenceActivity.SMS_DELIVERY_REPORT_MODE、
- DEFAULT_DELIVERY_REPORT_MODE)
- for(int i = 0 i
- {を試してください
- log( 'sub =' + mSubscriptionでデータベースを更新)
- Sms.addMessageToUri(mContext.getContentResolver()、
- Uri.parse( 'content:// sms / queued')、mDests [i]、
- mMessageText、null、mTimestamp、
- true / *読み取り* /、
- requestDeliveryReport、
- mThreadId、mSubscription)
- } catch(SQLiteException e){
- SqliteWrapper.checkSQLiteException(mContext、e)
- }
- }
[プレーン] プレーンビュー コピー
- //メッセージを送信するようにSmsReceiverServiceに通知します
- インテントインテント=新しいインテント(SmsReceiverService.ACTION_SEND_MESSAGE、null、mContext、SmsReceiver.class)
- intent.putExtra(SUBSCRIPTION、mSubscription)
- mContext.sendBroadcast(インテント)
3.4SmsReceiverからSmsReceiverServiceへ
実際、この男はSmsReceiverの秘書ではありません。取得後すぐにSmsReceiverServiceサービスに転送されます。 「これは私のためではありません、私は配達宅配便です。」 SmsReceiverの役割は次のように呼ばれます。メソッドはタイミング図を参照できます3.5 SmsReceiverService
長い間話し合った後、ようやく仕事に就きました。もちろんサービスなので、独自の宣言期間機能を経ます。まず、onCrateです。このメソッドは近年初期化され、次にonStartCommand()で初期化され、メソッドは実行されません。 ServiceHandlerにメッセージを送るだけで、人々は貢献するために自分たちの努力をしたようです。 1)ServiceHandlerはリクエストの送信を処理します [プレーン] プレーンビュー コピー- @オーバーライド
- public void handleMessage(Message msg){
- int serviceId = msg.arg1
- インテントインテント=(インテント)msg.obj
- if(intent!= null){
- 文字列action = intent.getAction()
- int error = intent.getIntExtra( 'errorCode'、0)
- if(SMS_RECEIVED_ACTION.equals(action)){
- handleSmsReceived(intent、error)
- } else if(SMS_CB_RECEIVED_ACTION.equals(action)){
- handleCbSmsReceived(intent、error)
- } else if(ACTION_BOOT_COMPLETED.equals(action)){
- handleBootCompleted()
- } else if(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(action)){
- handleServiceStateChanged(intent)
- } else if(ACTION_SEND_MESSAGE.endsWith(action)){
- handleSendMessage(intent)
- }
- }
- //注:stopSelf()を直接呼び出す必要があるため、直接呼び出さないでください。
- // AlertReceiverによって取得されたウェイクロックが解放されていることを確認します。
- SmsReceiver.finishStartingService(SmsReceiverService.this、serviceId)
- }
- }
3.6 SmsSingleRecipientSender
sendMessage()の説明:1つはSMSのコンテンツを分割することです。2つ目はSMSをOUTBOXのデータベーステーブルに保存することです。3つ目は分割されたSMSを個別に送信することです。4つ目は、呼び出されたSMSMangerクラスのsendMultipartTextMessage()が送信されます。送信された特定の操作は中間層に転送されます。具体的なコードは次のとおりです。 [プレーン] プレーンビュー コピー- if(mMessageText == null){
- //空のメッセージを送信しようとしないでください。宛先は、
- // 1。
- 新しいMmsException( 'メッセージ本文がヌルであるか、複数の宛先があります。')をスローします。
- }
- SmsManager smsManager = SmsManager.getDefault()
- ArrayListメッセージ= null
- if((MmsConfig.getEmailGateway()!= null)&&
- (Mms.isEmailAddress(mDest)|| MessageUtils.isAlias(mDest))){
- 文字列msgText
- msgText = mDest + '' + mMessageText
- mDest = MmsConfig.getEmailGateway()
- メッセージ= smsManager.divideMessage(msgText)
- } そうしないと {
- メッセージ= smsManager.divideMessage(mMessageText)
- //宛先番号からスペースを削除します(例: '801 555 1212'-> '8015551212')
- mDest = mDest.replaceAll( ''、 '')
- }
- int messageCount = messages.size()
- if(messageCount == 0){
- //空のメッセージを送信しようとしないでください。
- 新しいMmsException( 'SmsMessageSender.sendMessage:divideMessageが返されました' +
- '空のメッセージ。元のメッセージは '' + mMessageText + '' ')
- }
- ブール値の移動= Sms.moveMessageToFolder(mContext、mUri、Sms.MESSAGE_TYPE_OUTBOX、0)
- if(!moved){
- 新しいMmsException( 'SmsMessageSender.sendMessage:メッセージを移動できませんでした' +
- '送信トレイへ:' + mUri)
- }
- ArrayList deliveryIntents = new ArrayList(messageCount)
- ArrayList sentIntents = new ArrayList(messageCount)
- for(int i = 0 i
- if(mRequestDeliveryReport){
- // TODO:修正:必要はないはずです
- //このインテントでクラスを指定します。それをやって
- //カスタマイズ性を不必要に制限します。
- deliveryIntents.add(PendingIntent.getBroadcast(
- mContext、0、
- 新しいインテント(
- MessageStatusReceiver.MESSAGE_STATUS_RECEIVED_ACTION、
- ムリ、
- mContext、
- MessageStatusReceiver.class)、
- 0))
- }
- インテントインテント=新しいインテント(SmsReceiverService.MESSAGE_SENT_ACTION、
- ムリ、
- mContext、
- SmsReceiver.class)
- int requestCode = 0
- if(i == messageCount -1){
- //別の保留中のインテントになるようにrequestCodeを変更する
- //最後のフラグメントに対して作成されます
- // EXTRA_MESSAGE_SENT_SEND_NEXTをtrueに設定します。
- requestCode = 1
- intent.putExtra(SmsReceiverService.EXTRA_MESSAGE_SENT_SEND_NEXT、true)
- intent.putExtra(SUBSCRIPTION、mSubscription)
- }
- sentIntents.add(PendingIntent.getBroadcast(mContext、requestCode、intent、0))
- }
- {を試してください
- smsManager.sendMultipartTextMessage(mDest、mServiceCenter、messages、sentIntents、
- deliveryIntents、mSubscription)
- } catch(Exception ex){
- 新しいMmsException( 'SmsMessageSender.sendMessage:catched' + ex +をスローします
- 'SmsManager.sendTextMessage()から')
- }
- if(Log.isLoggable(LogTag.TRANSACTION、Log.VERBOSE)){
- log( 'sendMessage:address =' + mDest + '、threadId =' + mThreadId +
- '、uri =' + mUri + '、msgs.count =' + messageCount)
- }
転載:https://my.oschina.net/u/211005/blog/108999