有时Android BroadcastReceiver不起作用

时间:2015-03-01 12:10:17

标签: java android

阅读了很多有关SOF& amp;博客文章,我有BroadcastReceiver工作。但是我注意到它有时不起作用,特别是当我在电话中时。我只是想知道,如果我在通话之间收到短信,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?

修改

AsyncTask 包含在 isConnected 中。现在,如果手机没有连接到互联网&amp;我收到短信 AsyncTask 将不会被执行。在这种情况下,我想使用 ScheduledExecutorService 来安排 AsynckTask 在接下来的20分钟内以5分钟的间隔执行4次。我将非常感激,任何人都可以帮助我。

1 个答案:

答案 0 :(得分:2)

我无法确定断开连接,因为您还没有提供任何堆栈跟踪。但是我很确定当你收到短信时,系统正在广播SMS_RECEIVED广播动作。现在,如果由于连接错误或根本没有连接而没有收到短信,那么系统不会触发SMS_RECEIVED操作是完全合乎逻辑的,因为没有收到短信。

至于

  

当手机再次出现时,是否有任何解决方法可以执行AsyncTask   数据网

你可以实现另一个将收听network changes的广播接收器,但这看起来并不是一个好主意。您应该尝试重现问题并检查堆栈跟踪中的任何异常。

  

代码中有问题。

您的接收器似乎已在您的清单中正确注册, onReceive()方法似乎正在启动AsyncTaskdoInBackground似乎没有任何问题,onPostExecute(虽然官方示例似乎省略了对超级的任何调用)似乎没问题。

结论:尝试重现问题并从堆栈跟踪中收集可能导致错误的数据(网络开销可能是原因之一,但这只是猜测)。< / p>