2017-02-17 53 views
0

我有一個BroadcastReciever和一個服務。當建立互聯網連接時,它必須開始下載一些數據的服務。廣播接收器不工作。聲明在清單

我的廣播接收器

public class NetworkStateListener extends BroadcastReceiver 
{ 

@Override 
public void onReceive(Context c, Intent intent) 
    { 
    Toast.makeText(c,"started",Toast.LENGTH_SHORT).show(); 
    c.startService(new Intent(c,DataDownloader.class)); 

    // TODO: Implement this method 
    } 

} 

這裏是清單的部分代碼...

<receiver android:name="com.Example.SGSN.worker.NetworkStateListener" 
     android:enabled="true"> 
     <intent-filter android:priority="999"> 
      <action android:name="android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION"/> 
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> 
      <action android:name="android.net.wifi.WifiManager.SUPLICANT_STATE_CHANGED_ACTION"/> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
     </intent-filter> 
    </receiver> 

,並要求權限...

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

甚至不是一個單一的動作得到了觸發。我不知道我犯了什麼錯誤。我也尋找答案,但我的問題沒有解決。 當我在活動中動態註冊它時,BroadcastReceiver將工作。我需要它在後臺。有人請幫忙。

+0

爲什麼你使用那個 - 「android:process =」:channel「'? – Divers

+0

我不知道究竟是什麼,我在教程視頻中看到它。 –

+1

您在接收器中輸入錯誤=>接收器 – Jaythaking

回答

1

您應該刪除:

android:process=":channel"

UPD

下面的清單的代碼是100%的工作:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.andrey.test"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main2"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 

     <receiver 
      android:name=".MyReceiver" 
      android:enabled="true"> 
      <intent-filter> 
       <action android:name="android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION" /> 
       <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
       <action android:name="android.net.wifi.WifiManager.SUPLICANT_STATE_CHANGED_ACTION" /> 
       <action android:name="android.net.conn.CONNECTIVITY_ACTION" /> 
      </intent-filter> 
     </receiver> 

    </application> 

</manifest> 
+0

刪除了android:process =「:channel」但結果沒有改進:-( –

+0

我運行了這段代碼,它正在工作,我複製了整個清單 – Divers

+0

但是這裏沒有顯示任何Toast通知,服務沒有運行 –

1

在清單中,你設定的接收器標籤內的應用程序標籤?

喜歡:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <receiver android:name=".NetworkChangeReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
     </intent-filter> 
    </receiver> 
</application> 
+0

是的,但這裏只是複製了重要的代碼行 –

0

就Android牛軋糖的(API 24)。在Manifest中聲明的廣播接收器將不再被提醒「android.net.conn.CONNECTIVITY_CHANGE」事件。幫助節省電池:)。較舊版本的Android不受影響。

要在Nougat中收聽此事件,您必須以編程方式註冊廣播。

1

試試這樣實現:

首先你服務,這將監聽在網絡連接的變化:

public class SyncService extends Service { 

public static Intent getStartIntent(Context context) { 
    return new Intent(context, SyncService.class); 
} 


@Override 
public void onCreate() { 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, final int startId) { 
    Timber.i("Starting sync..."); 

    if (!NetworkUtil.isNetworkConnected(this)) { 
     Timber.i("Sync canceled, connection not available"); 
     stopSelf(startId); 
     return START_NOT_STICKY; 
    } 

    //Here you can define what you need to do when internet is available 
    //Can download from internet and sync to local for example 

    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    if (mSubscription != null) mSubscription.unsubscribe(); 
    super.onDestroy(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

public static class SyncOnConnectionAvailable extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION) 
       && NetworkUtil.isNetworkConnected(context)) { 
      Timber.i("Connection is now available, triggering sync..."); 
      context.startService(getStartIntent(context)); 
     } 
    } 
} 

廣播接收器將啓動該服務,然後根據你已經決定什麼作用在onStartCommand();

接下來在清單申報的服務如下:

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

<service android:name=".SyncService"/> 

<receiver 
    android:name=".SyncService$SyncOnConnectionAvailable" 
    android:enabled="false"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

這將通知服務隨時檢測到網絡的變化。

現在您需要從任何活動中啓動服務,因爲您希望服務在後臺運行,所以我毫無疑問將成爲您的主要活動。這個例子只會在主要活動按照我的例子開始時觸發。你可以根據自己的喜好調整它。

主要活動:

​​

而這僅僅是一個NetworkUtil類可以派上用場:

public class NetworkUtil { 

    public static boolean isNetworkConnected(Context context) { 
     ConnectivityManager cm = 
      (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
    } 

} 

的服務都將在MainActivity的onCreate這兩條線被觸發() 。根據您的需求調整此示例。我從https://github.com/ribot/android-boilerplate/的Ribot樣板代碼示例中使用了此示例的部分內容。