5

Sorunum olduğunda, siz gerçekten yardımcı oldunuz. Yani burada tekrar düştüğüm başka bir sorunla karşılaşıyorum ...:/getBoolean (EXTRA_NO_CONNECTIVITY) her zaman false döndürür

BroadcastReceiver'ı genişleten özel bir NetworkReceiver çalıştırıyorum. Telefonun internet bağlantısının ne zaman olduğunu belirlemek istiyorum, böylece ne zaman olursa olsun bir servis başlatabilirim. Ben konuların bir sürü ve benim için DOESNT'İŞ tüm başlıkları az ya da çok hızlı aşağıdaki koda okudum:

public class NetworkReceiver extends BroadcastReceiver { 

private static final String tag = NetworkReceiver.class.getSimpleName(); 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(tag,"****** NetworkReceiver // onReceive()"); 

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

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
     Log.i(tag,"****** NetworkReceiver // Network Down?: " + intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)); 
    } 

    // TODO Bug: Never stops the service. Stays always connected! 
    if(noConnection) { 
     Log.i(tag,"****** NetworkReceiver // Stopping Service..."); 
     context.stopService(new Intent(context, FetchService.class)); 
    } else { 
     Log.i(tag,"****** NetworkReceiver // Starting Service!"); 
     context.startService(new Intent(context, FetchService.class)); 
    } 
} 

Ben sorun logcat hep NetworkDown?: false döndürür ve hizmet asla durur olduğunu (o her zaman yeniden başlatır). Emitörde F8'e basarak denedim ve ayrıca yönlendiriciyi kapatarak dev telefonumda (SIM, internet erişimi wifi router'ım tarafından da denendi) çalıştırarak çalıştı -> İnternet erişimi garanti edilmiyor! intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) için:

... 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

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

Ben de çizgiyi değişmiş ben de hiçbir değişiklik olmadan ve bu benim manifest dosyasında <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> çalıştı dikkat etmelidir:

Benim Manifest aşağıdaki satırları içerir Sonuç her zaman doğruydu - ve böylece her zaman hizmetimi durdurmaya çalıştı ve asla başlamadı.

Niyet'ten gelen Ekstraların hiç okunmadığından şüpheleniyorum ve bu nedenle getBooleanExtra() varsayılan değeri her zaman geri dönüyor.

PS. Ben Android'im var

Teşekkürler!

cevap

3

BroadcastReceiver içinde okunamayan Ekstralar için emin değilim, ancak sizinki gibi bir amaçla BroadcastReceiver kullanıyorum şekilde size gösterebilirim.

Alıcığım yalnızca bağlantı değişikliklerini yakalar, ancak bağlantı durumunu değerlendirmez. Service'u, her iki durumda da (bağlı veya değil) bu hizmetin yapacak bir şey yapacağı konusunda bilgilendirir.

public class ConnectivityReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Intent intentService = new Intent(context, MyService.class); 
     intentService.putExtra(MyService.INTENT_HANDLE_CONNECTIVITY_CHANGE, ""); 

     context.startService(intentService); 
    } 
} 

Sonra benim hizmette, ben değerlendiriyorsunuz: o da başlamış ya da "bilgili" olacak şekilde bu hizmeti o anda çalışan ya da değil edilebilir (bu aramalar yapmak iç içe you can safely call startService() several times unutmayın) bağlantı ve ardından buna göre hareket et. Sizin gibi, bağlantı durumunu aynı şekilde değerlendirmek değil dikkat edin ve eserleri aşağıdaki kod ancak sizinkinden (aşağıda sadece ilgili kodudur) neden bu olabilir:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     final Bundle bundle = intent.getExtras(); 

     // Handle the intent INTENT_HANDLE_CONNECTIVITY_CHANGEif any 
     if ((bundle != null) && (bundle.get(INTENT_HANDLE_CONNECTIVITY_CHANGE) != null)) {   
      handleConnectivity(); 
     } 
    } 

    return START_STICKY; 
} 

private void handleConnectivity() { 
    final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

    if(netInfo != null && netInfo.isConnected()) { 
     // WE ARE CONNECTED: DO SOMETHING 
    } 
    else { 
     // WE ARE NOT: DO SOMETHING ELSE  
    } 
} 

Bu altında, gayet iyi çalışıyor Android-7 (2.1) de.

+0

Kullandığınız yöntemin farkındayım. Ancak, bir çok insanın benim kullandığım kodu tavsiye etmesi beni şaşırtmıştı (ayrıca son zamanlarda Android'de satın aldığım bir O'reilly kitabında okudum!)) CONNECTIVITY_ACTION yayınında bir çözüm bulamıyorsam, örneğinizi takip edeceğimi ve Servisim'de ConnectivityManager'ın yöntemleri ile bir kontrol yapacağımı düşünüyorum. Cevabınız için teşekkürler :) – snoopaki

+0

Snoopaki'ye hoş geldiniz - aslında yönteminizi kullanarak bir çözüm ile gelmeyi tercih ederim, ama ne olduğunu ve neden olduğunu göremiyorum. – Shlublu

+1

Hizmetimi bir IntentService olarak değiştirdim ve bağlantı değişiminin hizmet içi kullanımı daha anlamlı hale geldi. Bu yüzden cevabını doğru olanı seçmeliyim! thx :) – snoopaki

2

garip NO_CONNECTIVITY bayrağı hakkında bilmiyorum ama amacından aktif ağı alabilirsiniz: Muhtemelen sadece bu nesne üzerinde IsConnected() çağırabilir

(NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

.

+1

Cevap için Thanx, akılda tutacağım. Mevcut görev için yukarıdaki cevabı kullandım ve oldukça iyi çalışıyor :) – snoopaki

+1

Bu sabit şimdi kullanımdan kaldırıldı. –