2015-03-01 5 views
1

После прочтения большого количества тем на SOF & сообщение в блоге, у меня работает BroadcastReceiver. Но я заметил, что когда-то это не работает, особенно когда я звоню. Я просто хочу знать, работает ли BroadcastReceiver, если я получаю SMS-сообщение между звонком? или что-то не так в коде.Иногда Android BroadcastReceiver не работает

SmsReceiver.java

public class SmsReceiver extends BroadcastReceiver { 

public void onReceive(Context context, Intent intent) { 

    Log.d("SmsReceiver Broadcast", "OK"); 

    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 

    if (networkInfo != null && networkInfo.isConnected()) { 
     Log.d("Network is connected. Executing TheTask()", "OK"); 

    new TheTask().execute("http://somedomain.tld/index.php?userId=12345678"); 

    } 

    if (networkInfo == null) { 

     Log.d("Network is NOT connected.", "FAIL"); 
    } 

} 

class TheTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... arg0) { 
     String text = null; 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(arg0[0]); 
      HttpResponse resp = httpclient.execute(httppost); 
      HttpEntity ent = resp.getEntity(); 
      text = EntityUtils.toString(ent); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return text; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

     String tocheck = "Some text"; 
     if(result.contains(tocheck)) 
     { 
      Log.d("string contains some text", result); 
     } 
    } 
} 
} 

AndroidManifest.xml

 <receiver android:name=".SmsReceiver" android:enabled="true" > 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

Я использую 3G-сети. Это может быть связано с отключением сети. Если да, есть ли способ обхода AsyncTask, когда мой телефон снова получит сеть передачи данных?

EDIT:

Обернул AsyncTask в IsConnected. Теперь, если телефон не подключен к Интернету & Получаю SMS AsyncTask не будет выполнен. В этой ситуации я хочу использовать ScheduledExecutorService, чтобы запланировать AsynckTask будет выполнен 4 раза с интервалом 5 минут в течение следующих 20 минут. Я буду очень признателен, если кто-нибудь сможет мне помочь в этом.

ответ

2

Я не могу быть уверен в отключении, так как вы не указали трассировку стека. Но я уверен, что трансляция SMS_RECEIVED транслируется по всей системе, когда вы получаете смс. Теперь, если вы не получаете SMS из-за плохого соединения или вообще не подключаетесь, совершенно логично, что система не запускает действие SMS_RECEIVED, так как не получено SMS.

Что касается

есть ли обходной путь, чтобы выполнить AsyncTask, когда мой телефон снова получить СЕТЕВЫЕ данных,

вы можете реализовать другой радиовещательный приемник, который будет прослушивать network changes но это не кажется такой хорошей идеей. Вы должны попытаться воспроизвести проблему и проверить исключения в трассировке стека.

В коде что-то не так.

Ваш приемник, кажется, правильно зарегистрирован в манифесте, метод onReceive(), кажется, правильно запускать AsyncTask, doInBackground, кажется, не имеют каких-либо проблем и onPostExecute (хотя официальный пример кажется, опускаем любой вызов супер), кажется, все в порядке.

Заключение: Попробуйте воспроизвести проблему и собрать данные из трассировки стека в отношении того, что может вызвать ошибку (сетевые издержки могут быть одной причиной, но это только предположение).

+1

Прошу прощения, я плохо разбираюсь в английском. Я действительно ценю ваши усилия для ответа. – Aman

+0

Прошу прощения, я плохо разбираюсь в английском. Я очень ценю ваши усилия для ответа. Здесь я снова объясняю проблему, с которой я столкнулся. Я пытаюсь выполнить AsyncTask всякий раз, когда получаю SMS. Код работает отлично, когда мобильные данные телефона включены и когда в диапазоне Wi-Fi. Но во время вождения или между вызовами, иногда мобильные данные могут быть отключены. В этом случае я хочу отложить вызов AsyncTask для выполнения, когда мой телефон входит в диапазон Wifi или подключается к Mobile Data. Ofcourse SMS_RECEIVED запускается каждый раз при получении SMS. – Aman

+1

Попробуйте использовать NetworkInfo.isConnected(), чтобы узнать, есть ли активное сетевое подключение: http://developer.android.com/reference/android/net/NetworkInfo.html#isConnected() – Buddy

Смежные вопросы