java - 有时 Android BroadcastReceiver 不起作用

标签 java android

在阅读了很多有关 SOF 的主题和博客文章后,我已经让 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中。现在,如果手机未连接到互联网并且我收到短信,则 AsyncTask 将不会执行。在这种情况下,我想使用 ScheduledExecutorService 安排 AsynckTask 在接下来的 20 分钟内以 5 分钟的间隔执行 4 次。我将非常感谢任何人可以在这方面帮助我。

最佳答案

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

至于

is there any workaround to execute AsyncTask when my phone again get data network

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

is something is wrong in the code.

您的接收器似乎已在您的 list 中正确注册, onReceive() 方法似乎正确启动了 AsyncTaskdoInBackground 似乎没有任何问题,而 onPostExecute (尽管官方示例似乎省略了对 super 的任何调用)似乎也很好。

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

关于java - 有时 Android BroadcastReceiver 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793363/

相关文章:

java - 如何让 javac 使用 .jar 的类?

java - 使用 pdfView api 打印阿拉伯字符

java - 从 xml 中查找所有有效的 xpath

从不同的类调用时 Java repaint() 不起作用

java - 如何以编程方式为 Textview 设置 `app:backgroundTint` ?

Android (API 10) fragment 错误

java - 为什么我的链表中的数据不显示? java

android - 单击图标时如何禁用底部导航 View 中的动画?

android - 如何在 Android 中动态更新 Spinner 中的数据?

android - 如何在android中添加一个圆角矩形toggle_switch?