ANDROID Показывает диалог, когда Интернет /GPS теряет связь или не подключен
[EDITED]
Я хочу показать экран заставки/диалог, когда Интернет или GPS отключены или не подключены, поэтому пользователь не может использовать приложение, пока соединение не станет хорошим снова.
Я пробовал с некоторыми вещательными приемниками, но у всех были проблемы. Один из них:
public class ConnectivityChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
String status = NetworkUtil.getConnectivityStatusString(context);
Toast.makeText(context, status, Toast.LENGTH_LONG).show();
if(status.equals("Not connected to Internet")) {
Intent splashIntent = new Intent(context, SplashScreen.class);
splashIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(splashIntent);
//I also had a Toast for internet is connected
}
}
}
И класс util:
public class NetworkUtil {
public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 2;
public static int TYPE_NOT_CONNECTED = 0;
public static int getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
public static String getConnectivityStatusString(Context context) {
int conn = NetworkUtil.getConnectivityStatus(context);
String status = null;
if (conn == NetworkUtil.TYPE_WIFI) {
status = "Wifi enabled";
} else if (conn == NetworkUtil.TYPE_MOBILE) {
status = "Mobile data enabled";
} else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
status = "Not connected to Internet";
}
return status;
}
}
Проблемы: он не работает мгновенно. Обычно я получаю 5 тостов подряд, когда интернет отключен, и через некоторое время, если я изменю статус, соединение перестает появляться или появляется после долгого ожидания времени.
Также, как закрыть действие Splash Screen при резервном копировании в Интернете?
Ответы
Ответ 1
вы можете создать класс Service
и использовать TimerTask
с Timer
и дать ему время для начала, с помощью этого вы можете запустить свой Service
из receiver
, который у вас уже есть, и сделать его (receiver
) прослушать BOOT_COMPLETED
с помощью
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
и укажите разрешение <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
и позвольте вашему приемнику позвонить в класс обслуживания - (или вы можете проверить свой материал там - (учтите комментарии, которые я сделал)), выполнив это в onReceive
boolean isMyServiceRunning(Class<?> serviceClass, Context t) {
ActivityManager manager = (ActivityManager) t.getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
и если он возвращает функцию ложного запуска с помощью
Intent i = new Intent(context, MyService.class);
context.startService(i);
то в вашей службе выполните это
public class MyService extends Service {
Timer timer; TimerTask task;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
// put here your code for checking
String status = NetworkUtil.getConnectivityStatusString(context);
// i am having nesting problems so put this in a handler() ok
Toast.makeText(context, status, Toast.LENGTH_LONG).show();
if(status.equals("Not connected to Internet")) {
Intent splashIntent = new Intent(context, SplashScreen.class);
splashIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(splashIntent);
}
// handler() code should end here
};
timer.schedule(task, 0, 3000); // repeat every 3 seconds
return START_STICKY;
}
}
его получение, чтобы закрыть ваш заставку, вы можете передать экземпляр своей деятельности и закрыть ее из службы или связать с ней службу или использовать локальный менеджер рассылки
также мои теги закрытия кода могут быть неправильными, поэтому исправьте их.
Ответ 2
Попробуйте ниже решение
ШАГ 1:
Сделайте Java Class
с именем NetworkStatus
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetworkStatus
{
Context context;
public NetworkStatus(Context context)
{
this.context = context;
}
public boolean isNetworkOnline()
{
boolean status = false;
try
{
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getNetworkInfo(0);
if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED)
{
status = true;
}
else
{
netInfo = cm.getNetworkInfo(1);
if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED)
{
status = true;
}
}
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
return status;
}
}
ШАГ 2:
Сделайте еще один Class
с именем AlertDialogManager
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.provider.Settings;
import com.lmkt.wfm.R;
import com.lmkt.wfm.activities.ActivityMainScreen;
public class AlertDialogManager
{
Context context;
public AlertDialogManager(Context context)
{
this.context = context;
}
public void showAlertDialog(String title, final String message, final Boolean status)
{
AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
alertDialog.setTitle(title);
alertDialog.setMessage(message);
if(status != null)
{
alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);
}
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
if(message.contains("You do not have Internet Connection"))
{
((Activity) context).finish();
}
dialog.dismiss();
}
});
alertDialog.show();
}
}
ШАГ 3: Использование вашей активности Splash:
AlertDialogManager alert;
NetworkStatus ns;
ns = new NetworkStatus(context);
if(!(ns.isNetworkOnline()))
{
alert = new AlertDialogManager(context);
alert.showAlertDialog("Internet Connection!", "You do not have Internet Connection. "
+ "Please connect to the "
+ "Internet to sync Data From Server...", false);
}
Ответ 3
ШАГ 1:
Откройте AndroidManifest.xml и добавьте широковещательный приемник.
<receiver
android:name=".Util.InternetConnectorReceiver"
android:enabled="true">
<intent-filter>
<!-- Intent filters for broadcast receiver -->
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>`
ШАГ 2: создайте активность с помощью темы диалога:
<activity
android:name=".Activity.ActivityDialogInternet"
android:theme="@style/AppTheme.Dark.Dialog"></activity>
ШАГ 3:
Создайте класс BroadcastReceiver с именем InternetConnectorReceiver
public class InternetConnectorReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED) ||
intent.getAction().equalsIgnoreCase("android.net.conn.CONNECTIVITY_CHANGE")) {
Intent checkIntent = new Intent(context, ConnectivityCheck.class);
context.startService(checkIntent);
}
}}
ШАГ 4: Сделайте еще один класс обслуживания с именем ConnectivityCheck:
public class ConnectivityCheck extends Service {
@Override
public void onCreate() {
super.onCreate();
if (!checkConnection()) {
Toast.makeText(context, "off", Toast.LENGTH_LONG).show();
Intent dialogIntent = new Intent(this, ActivityDialogInternet.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
}
stopSelf();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private boolean checkConnection() {
Log.i("wudfuyf", "checking started!!!!!!!!!!!!!!!!!!");
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
}}
ШАГ 5: создайте действие под названием ActivityDialogInternet
public class ActivityDialogInternet extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog_internet);
}}
ШАГ 6: При отключении подключения к Интернету ActivityDialogInternet и покажите диалог: