У меня есть работа вокруг, без кодирования закусочная во всех видах деятельности onCreate()
метод.
Мы можем использовать класс приложения для вызова BroadcastReciever
. Как указано ниже.
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
public static Activity appactivity;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
appactivity = activity;//here we get the activity
Intent i = new Intent(this, InternetConnectionInformation.class);
sendBroadcast(i);//here we are calling the broadcastreceiver to check connection state.
}
}
Теперь мы можем использовать наш класс BroadcastReceiver показать закусочную, а
public class InternetConnectionInformation extends BroadcastReceiver{
static Snackbar snackbar; //make it as global
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager
= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo == null || !activeNetworkInfo.isConnected()) {
InternetConnectionInformation.snack(null, 0, "Network Connection failed.",context.getApplicationContext());
}else{
InternetConnectionInformation.hideSnackbar();
}
}
public static void snack (HashMap<String,View.OnClickListener> actions,int priority,String message,Context context) {
if(MyApplication.appactivity != null){
snackbar = Snackbar.make(MyApplication.appactivity.findViewById(android.R.id.content), message, Snackbar.LENGTH_INDEFINITE);//MyApplication.appactivity from Application class.
if (actions != null) {
Iterator iterator = actions.entrySet().iterator();
snackbar.setDuration(Snackbar.LENGTH_INDEFINITE);
while (iterator.hasNext()) {
Map.Entry pair = (Map.Entry) iterator.next();
snackbar.setAction((String) pair.getKey(), (View.OnClickListener) pair.getValue());
iterator.remove(); // avoids a ConcurrentModificationException
}
}
switch (priority) {
case 0:
snackbar.getView().setBackgroundColor(context.getResources().getColor(R.color.accentPink));
break;
case 1:
snackbar.getView().setBackgroundColor(Color.parseColor("#66ccff"));
break;
case 2:
snackbar.getView().setBackgroundColor(Color.parseColor("#66ff33"));
break;
}
snackbar.show();
}
}
private static void hideSnackbar(){
if(snackbar !=null && snackbar.isShown()){
snackbar.dismiss();
}
}
}
Чтобы скрыть закусочные, нам нужно проверить состояние подключения.Так BroadcastReceiver зарегистрирован в Manifest
<receiver android:name="your.package.name.InternetConnectionInformation">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Это прекрасно работает и тестируется. Надеюсь, это поможет некоторым.
BroadcastReceiver с обратной связью не вызывает никакого чувства ... ресивер должен заканчивать свою жалкую жизнь сразу после onRecive end ... onRecive вызывается в основном потоке ... это означает, что если вы не закончите, он не обновит UI ... сделайте это обычным способом ... в onRecive show notification (который будет действовать как ваша обратная связь) – Selvin
можно разместить snakbar вместо тоста в моем коде. – praj