2016-05-12 86 views
0

當我需要使用互聯網連接並且它不可用時,我想設置一個廣播接收器,在應用程序關閉時繼續工作。保持連接廣播接收器在應用程序關閉後運行

我正在使用該服務,但它不起作用。它可以在應用程序在屏幕上或暫停時正常工作,但如果關閉它,它將停止工作。我不確定我是否應該使用其他的東西,或者如果我做錯了什麼。

這是我的代碼:

package com.example.ana.exampleapp; 

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.SharedPreferences; 
import android.os.IBinder; 
import android.util.Log; 

public class TestsService extends Service { 

    private static BroadcastReceiver networkChangeReceiver; 
    private static String TAG = "Service"; 

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

    @Override 
    public void onCreate() { 
     Log.v(TAG, "Service created"); 
     boolean keep = needTokeepWaiting() 
     if(!keep) 
      stopSelf(); 
    } 

    @Override 
    public void onDestroy() { 
     if (networkChangeReceiver != null) 
      unregisterReceiver(networkChangeReceiver); 
     networkChangeReceiver = null; 
     Log.v(TAG, "Service destroyed"); 
    } 

    private void registerNetworkChangeReceiver() { 
     networkChangeReceiver = new BroadcastReceiver() { 
      private String TAG = "NetworkReceiver"; 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       Log.v(TAG, "Connection changed received"); 
          boolean keep = needTokeepWaiting() 
       if(!keep) 
        stopSelf(); 
      } 
     }; 
     IntentFilter filter = new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION); 
     registerReceiver(networkChangeReceiver, filter); 
    } 
} 

而且我manisfest:

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

    <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:windowSoftInputMode="stateHidden"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".RegisterActivity"></activity> 
     <activity android:name=".FinishRegisterActivity"></activity> 
     <activity android:name=".TestActivity"></activity> 
     <activity android:name=".InformationActivity"></activity> 
     <service android:name=".TestsService"></service> 
    </application> 

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

而且在測試活動時,有必要我做的:

Intent service = new Intent(this, TestsService.class); 
startService(service); 

什麼我做的是類似於這裏所建議的,但它不起作用:

Keep broadcast receiver running after application is closed

我也試圖做沒有一個服務,在清單中註冊,但它沒有工作也不:

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

    <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:windowSoftInputMode="stateHidden"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".RegisterActivity"> 
     </activity> 
     <activity android:name=".FinishRegisterActivity" > 
     </activity> 
     <activity android:name=".TestActivity"> 
     </activity> 
     <activity android:name=".InformationActivity" > 
     </activity> 
     <receiver android:name=".NetworkChangeReceiver" 
      android:enabled="false"> 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
      </intent-filter> 
     </receiver> 
    </application> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
</manifest> 
+0

您不需要爲該廣播持續運行「服務」。您可以在清單中爲''android.net.conn.CONNECTIVITY_CHANGE''''註冊一個''。 –

+0

我曾試過,但當我關閉應用程序停止工作。我已經添加了如何在清單中註冊,也許我做錯了什麼。 – ana06

+0

我看到你想出你的'服務'問題,但你真的不需要它一直運行。你的''被禁用。將'enabled'屬性的值更改爲'true',或者將其刪除,並確保'name'指向一個有效的'BroadcastReceiver'類。您需要在安裝後至少啓動一次您的應用程序,以使其脫離_stopped_狀態,但在此之後,只要連接發生變化,您的Receiver就會觸發。 –

回答

0

我剛剛發現了這個問題。 Android 4.4.x中存在一個錯誤,它會在關閉應用程序時終止後臺服務。我正在Android 4.4.2中測試我的應用程序。這裏有一個詳細的解釋:

http://www.androidpolice.com/2014/03/07/bug-watch-stopping-apps-on-android-4-4-2-can-silently-kill-related-background-services-a-fix-is-on-the-way/

所以我的代碼是正確的,因爲我在安卓4.2.2試圖和它的作品(我曾嘗試重寫onStartCommand()所以也許認爲需要)。

-1

如果你不想讓你的服務停止時應用程序被關閉,你應該重寫onStartCommand()方法做這樣的事情:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_REDELIVER_INTENT; 
} 

您可以返回START_STICKYSTART_REDELIVER_INTENT,任何可以更好

+0

它不起作用。我想這可能是服務不會停止,當我關閉應用程序,只是BroadcastReceiver停止工作,雖然我不知道。我的意思是故意關閉應用程序。用戶在「最近的應用程序」屏幕上刷出應用程序後。 – ana06

+1

你應該確定服務是否停止。嘗試使用斷點或查看logcat來檢查是否調用了'onDestroy()' –

+0

'onDestroy()'未被調用。 – ana06

相關問題