0

私は現在、ブロードキャスト レシーバーを管理するサービスを持っています。この受信機は、オンとオフを切り替えることができます。

現時点では、SMS が受信されると OnReceive がトリガーされます。次に、SMS をサーバーにアップロードします。コードは正常に動作しますが、上記の 3.0 からネットワーク接続を Async タスクで実行する必要があると聞きました。そうでない場合でも、アップロードを別のスレッドに移動したいので、アップロード タスクは UI スレッドをブロックできません。(サービスを IntentService に移動するのにうんざりしています。これにより、ブロードキャスト レシーバー リークが発生します)

          SMSBR = new BroadcastReceiver(){

            @Override
            public void onReceive(Context context, Intent intent) {
                //START OF ONRECIVER************************
                Bundle extras = intent.getExtras();

                String strMessage = "";

                if ( extras != null )
                {
                    Object[] smsextras = (Object[]) extras.get( "pdus" );

                    for ( int i = 0; i < smsextras.length; i++ )
                    {
                        SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]);

                        String strMsgBody = smsmsg.getMessageBody().toString();
                        String strMsgSrc = smsmsg.getOriginatingAddress();

                        strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;                    

                        Log.d("Message", "is "+strMessage);
                        //***************************************************************
                        InputStream is = null;
                        try{
                            HttpClient httpclient = new DefaultHttpClient();
                            HttpPost httppost = new HttpPost("http://mayar.abertay.ac.uk/~1001077/insert.php");

                            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                                nameValuePairs.add(new BasicNameValuePair("DeviceNumber", telephonyManager.getLine1Number().toString()));
                                nameValuePairs.add(new BasicNameValuePair("SenderNumber", strMsgSrc));
                                nameValuePairs.add(new BasicNameValuePair("Message", strMsgBody));
                                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                                HttpResponse response = httpclient.execute(httppost);
                                HttpEntity entity = response.getEntity();
                                is = entity.getContent();
                                Log.d("is = ", is.toString());
                                Log.d("In SMS", "Sender success");
                                  if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
                                        Log.d("Message upload Running", "on UI");
                                    } else {
                                        Log.d("Message upload NOT running", "on UIx");
                                    }

                        }catch (Exception e){
                            Log.e("Log_tag", "Error in http sms " + e.toString());
                            Log.d("In SMS", "Sender NOT success");
                        }
                        //****************************************************************

                    }

                }
                //END OF ON RECEIVE****************************
            }


          };
4

1 に答える 1

1

AsyncTasks については話さずに、あなたの質問に答えさせてください。

BroadcastReceiver.registerReceiver (BroadcastReceiver レシーバー、IntentFilter フィルター、String broadcastPermission、Handler スケジューラー)

BroadcastReceiversに関するいくつかのドキュメントを確認しているときに、必要なもののように見えることがわかりました(このリンクを確認してください)。もう 1 つのヒント: と組み合わせて使用​​しHandlerThreadます。

于 2013-05-01T15:53:18.763 に答える