使用Android的广播检查Internet连接 [英] Android Check Internet Connection using Broadcast

查看:104
本文介绍了使用Android的广播检查Internet连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现广播接收器,我的互联网连接检查。如果连接不present只是完成();它。但我仍然搞乱了上下文。请在下面我codeS检查。

  / **
 *本广播接收装置,开机后苏醒并注册服务,
 *从所有已知接触新照片检查。
 * /
公共类ConnectionDetector扩展广播接收器
{
    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){    布尔noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,FALSE);     如果(noConnectivity){         )((活动)上下文).finish(;
         //显示警告讯息
         //关闭应用程序,我建议的方式
     }    }
}

AndroidManifest

 <接收机器人:名字=。ConnectionDetector
                        机器人:标签=NetworkConnection>
        &所述;意图滤光器>
            <作用机器人:名字=android.net.conn.CONNECTIVITY_CHANGE/>
        &所述; /意图滤光器>
        < /接收器>

LogCat中:

  11-01 22:40:29.179:E / AndroidRuntime(29531):致命异常:主要
11-01 22:40:29.179:E / AndroidRuntime(29531):了java.lang.RuntimeException:无法启动接收in.wptrafficanalyzer.actionbarsherlocknavtab.ConnectionDetector:java.lang.ClassCastException:android.app.ReceiverRestrictedContext
11-01 22:40:29.179:E / AndroidRuntime(29531):在android.app.ActivityThread.handleReceiver(ActivityThread.java:1809)
11-01 22:40:29.179:E / AndroidRuntime(29531):在android.app.ActivityThread.access $ 2400(ActivityThread.java:117)
11-01 22:40:29.179:E / AndroidRuntime(29531):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:985)
11-01 22:40:29.179:E / AndroidRuntime(29531):在android.os.Handler.dispatchMessage(Handler.java:99)
11-01 22:40:29.179:E / AndroidRuntime(29531):在android.os.Looper.loop(Looper.java:130)
11-01 22:40:29.179:E / AndroidRuntime(29531):在android.app.ActivityThread.main(ActivityThread.java:3691)
11-01 22:40:29.179:E / AndroidRuntime(29531):在java.lang.reflect.Method.invokeNative(本机方法)
11-01 22:40:29.179:E / AndroidRuntime(29531):在java.lang.reflect.Method.invoke(Method.java:507)
11-01 22:40:29.179:E / AndroidRuntime(29531):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:907)
11-01 22:40:29.179:E / AndroidRuntime(29531):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
11-01 22:40:29.179:E / AndroidRuntime(29531):在dalvik.system.NativeStart.main(本机方法)
11-01 22:40:29.179:E / AndroidRuntime(29531):java.lang.ClassCastException:产生的原因android.app.ReceiverRestrictedContext
11-01 22:40:29.179:E / AndroidRuntime(29531):在in.wptrafficanalyzer.actionbarsherlocknavtab.ConnectionDetector.onReceive(ConnectionDetector.java:29)
11-01 22:40:29.179:E / AndroidRuntime(29531):在android.app.ActivityThread.handleReceiver(ActivityThread.java:1798)
11-01 22:40:29.179:E / AndroidRuntime(29531):10 ...更多


解决方案

您在BroadcastReciever得到的上下文是不是一个活动。 BroadcastReciever外面工作的活动,而不是依赖于一个,除非您特别成功的。

在互联网上的问题把刚刚完成的活动留出不好的做法不通知用户就可以做到以下几点:

 公共抽象类ConnectionAwareActivity延伸活动{保护最后的IntentFilter mIntentFilter =新的IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); //一种用于BR过滤器。我们要收听互联网的变化
保护最终ConnectionDetector mConnectionDetector =新ConnectionDetector(); //创建我们的BR的一个实例的活动使用@覆盖
保护无效onResume(){
    super.onResume();
    尝试{
        registerReceiver(mConnectionDetector,mIntentFilter); //活动得到所示,我们注册一个BR并开始接收有关网络更改的通知
    }赶上(例外EXC){
        //哎呦
    }
}@覆盖
保护无效的onPause(){
    super.onPause();
    尝试{
        unregisterReceiver(mConnectionDetector); //尝试注销BR,当活动是不是用户可见的,因为我们不希望在互联网上的变化进行任何操作
    }赶上(例外EXC){
        //哎呦
    }
}//你的BR被封装在活动,因此具有获得它的方法,因为它具有访问到活动实例
保护类ConnectionDetector扩展广播接收器{
    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){
        布尔noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,FALSE);
        如果(noConnectivity){
            完();
        }    }
}

}

使用它作为您其他活动超(这个从活动延伸,将其更改为其他),必须在连接错误而终止。

这是非常基本型,有点错了,因为你在超好preFER组成

I would like to implement a broadcast receiver for my internet connection checking. If connection is not present just finish(); it. But i am still messing up the context . Please check on my below codes.

/**
 * This broadcast receiver is awoken after boot and registers the service that
 * checks for new photos from all the known contacts.
 */


public class ConnectionDetector extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) {



    boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,false);

     if(noConnectivity){

         ((Activity)context).finish();
         //Show Warning Message
         //Close Application the way i suggested
     }

    }


}

AndroidManifest

 <receiver      android:name=".ConnectionDetector"
                        android:label="NetworkConnection">
        <intent-filter>
            <action     android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
        </receiver>

LogCat :

11-01 22:40:29.179: E/AndroidRuntime(29531): FATAL EXCEPTION: main
11-01 22:40:29.179: E/AndroidRuntime(29531): java.lang.RuntimeException: Unable to start receiver in.wptrafficanalyzer.actionbarsherlocknavtab.ConnectionDetector: java.lang.ClassCastException: android.app.ReceiverRestrictedContext
11-01 22:40:29.179: E/AndroidRuntime(29531):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:1809)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at android.app.ActivityThread.access$2400(ActivityThread.java:117)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at android.os.Looper.loop(Looper.java:130)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at android.app.ActivityThread.main(ActivityThread.java:3691)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at java.lang.reflect.Method.invokeNative(Native Method)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at java.lang.reflect.Method.invoke(Method.java:507)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at dalvik.system.NativeStart.main(Native Method)
11-01 22:40:29.179: E/AndroidRuntime(29531): Caused by: java.lang.ClassCastException: android.app.ReceiverRestrictedContext
11-01 22:40:29.179: E/AndroidRuntime(29531):    at in.wptrafficanalyzer.actionbarsherlocknavtab.ConnectionDetector.onReceive(ConnectionDetector.java:29)
11-01 22:40:29.179: E/AndroidRuntime(29531):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:1798)
11-01 22:40:29.179: E/AndroidRuntime(29531):    ... 10 more

解决方案

The context you get in BroadcastReciever is not an Activity. BroadcastReciever works outside of activity and isn't tied to one, unless you specifically make it.

Putting aside bad practice of just finishing activity on internet problem without notifying user you can do the following:

public abstract class ConnectionAwareActivity extends Activity {

protected final IntentFilter mIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); // A filter for a BR. We want to listen to internet changes
protected final ConnectionDetector mConnectionDetector = new ConnectionDetector(); // Creating an instance of our BR for activity to use

@Override
protected void onResume() {
    super.onResume();
    try {
        registerReceiver(mConnectionDetector, mIntentFilter); // Activity gets shown, we register a BR and it starts to receive notifications about internet changes
    } catch (Exception exc) {
        // whoops
    }
}

@Override
protected void onPause() {
    super.onPause();
    try {
        unregisterReceiver(mConnectionDetector); // Try to unregister BR, since when activity is not visible to user, we don't want to perform any operations on internet change
    } catch (Exception exc) {
        // whoops
    }
}

// Your BR that is encapsulated in Activity and therefore has access to it's methods, since it has access to Activity instance
protected class ConnectionDetector extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        if (noConnectivity) {
            finish();
        }

    }
}

}

Use it as a superclass for your other activities (this one extends from Activity, change it to whatever), that must be terminated on connectivity errors.

It's very basic variant and somewhat wrong, since you better prefer composition over superclasses

这篇关于使用Android的广播检查Internet连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆