2017-01-31 11 views
2

firebaseデータベース内のデータを更新するバックグラウンドインテントサービスを作成しました。 アプリケーションがフォアグラウンドになると、データが正しく更新されます。しかし、アプリケーションが終了すると、データはfirebaseデータベースで更新されません。インテントサービスから更新する際にFirebaseデータベースが更新されない

サービスは、マニフェストファイル

<service 
     android:name=".service.MyIntentService" 
     android:enabled="true" 
     android:exported="true"></service> 

アプリがバックグラウンドで動作しているとき、私のアプリがフォアグラウンドであるが、いないとき正常に動作する意向サービスクラスに宣言します。

import android.app.IntentService; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 
import com.softwebsolutions.datetime.DateTime; 
import com.softwebsolutions.devicemanagement.bean.WifiStatus; 
import com.softwebsolutions.devicemanagement.utils.Utility; 

/** 
* An {@link IntentService} subclass for handling asynchronous task requests in 
* a service on a separate handler thread. 
* <p> 
* TODO: Customize class - update intent actions, extra parameters and static 
* helper methods. 
*/ 
public class MyIntentService extends IntentService { 
    // TODO: Rename actions, choose action names that describe tasks that this 
    // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS 
    private static final String ACTION_FOO = 
     "com.softwebsolutions.devicemanagement.service.action.FOO"; 
    private static final String ACTION_BAZ = 
     "com.softwebsolutions.devicemanagement.service.action.BAZ"; 

    // TODO: Rename parameters 
    private static final String EXTRA_PARAM1 = 
     "com.softwebsolutions.devicemanagement.service.extra.PARAM1"; 
    private static final String EXTRA_PARAM2 = 
     "com.softwebsolutions.devicemanagement.service.extra.PARAM2"; 
    private static final String EXTRA_PARAM3 = 
     "com.softwebsolutions.devicemanagement.service.extra.PARAM3"; 
    private static final String TAG = MyIntentService.class.getSimpleName(); 

    public MyIntentService() { 
    super("MyIntentService"); 
    } 

    // TODO: Customize helper method 
    public static void startActionFoo(Context context, String param1, String param2, String param3) { 
    Intent intent = new Intent(context, MyIntentService.class); 
    intent.setAction(ACTION_FOO); 
    intent.putExtra(EXTRA_PARAM1, param1); 
    intent.putExtra(EXTRA_PARAM2, param2); 
    intent.putExtra(EXTRA_PARAM3, param3); 
    context.startService(intent); 
    } 

    @Override protected void onHandleIntent(Intent intent) { 
    if (intent != null) { 
     final String action = intent.getAction(); 
     final String wifiMac = intent.getStringExtra(EXTRA_PARAM1); 
     final String strSSID = intent.getStringExtra(EXTRA_PARAM2); 
     final String macAddress = intent.getStringExtra(EXTRA_PARAM3); 
     handleActionFoo(wifiMac, strSSID, macAddress, getApplicationContext()); 
    } 
    } 


    private void handleActionFoo(final String wifiMac, final String strSSID, 
     final String macAddress, final Context context) { 
    Log.e(TAG, "onReceive.......service........"); 
    DatabaseReference mDatabaseTmp = 
     FirebaseDatabase.getInstance().getReference("Android").child("wifiList").child(wifiMac); 

    mDatabaseTmp.addValueEventListener(new ValueEventListener() { 
     @Override public void onDataChange(DataSnapshot dataSnapshot) { 
     Log.e(TAG, "onReceive.......addValueEventListener"); 
     if (dataSnapshot != null) { 
      Log.e(TAG, "onReceive.......dataSnapshot...NOT NULL"); 
      String floorName = "Not detect"; 
      if (dataSnapshot.getValue() != null) { 
      floorName = dataSnapshot.getValue().toString(); 
      Log.e(TAG, "onReceive: ----------->" + floorName); 
      } 
     } 
     } 

     @Override public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    mDatabaseTmp.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override public void onDataChange(DataSnapshot dataSnapshot) { 
     Log.e(TAG, "onReceive.......dataSnapshot..."); 
     if (dataSnapshot != null) { 
      Log.e(TAG, "onReceive.......dataSnapshot...NOT NULL"); 
      String floorName = "Not detect"; 
      if (dataSnapshot.getValue() != null) { 
      floorName = dataSnapshot.getValue().toString(); 
      } 

      String currentDate = 
       DateTime.getInstance().getCurrentDateTime(" yyyy-MM-dd'T'HH:mm:ss.SSSS'Z'"); 
      Log.e(TAG, "onReceive.......dataSnapshot..." 
       + currentDate 
       + " Floor Name -------->" 
       + floorName); 

      String deviceId = Utility.getDeviceID(context); 

      WifiStatus wifiStatus = new WifiStatus(); 
      wifiStatus.setDeviceId(deviceId); 
      wifiStatus.setName(strSSID); 
      wifiStatus.setMacAddress(macAddress); 
      wifiStatus.setDate(currentDate); 
      wifiStatus.setStatus(WifiStatus.STATUS_CONNECTED); 
      wifiStatus.setFloorName(floorName); 

      Utility.updateWifiStatus(context, wifiStatus); 
     } else { 
      Log.e(TAG, "onReceive.......dataSnapshot...NULL"); 
     } 
     } 

     @Override public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    } 

} 
+0

サービスクラスはContextクラスを拡張します。 getApplicationContext()を 'handleActionFoo'メソッドに渡す代わりに、' MyIntentService.this'を渡すべきです。 –

+0

私はまだサービスコンテキストにも合格しました@RosárioPereiraFernandes –

答えて

1

IntentServiceだけであればhandleIntentを取るとして有効のままになります()次の目的にサービスを提供し、これ以上の保留中の意図があります。各インテントはサービスの「コマンド」と考えることができ、コマンドを完了するまで実行されます。最後のコマンドが終了すると、それは停止します。したがって、通常は非常に長い間実行されません。 IntentServiceが長期間実行され続けることを期待しているなら、IntentServiceをまったく使用したくないかもしれません。

また、Androidサービスでは、アプリがフォアグラウンド(表示)かバックグラウンド(非表示)かは気になりません。それらは、関係なく開始および停止することができます。アプリをホストするプロセスが無期限に実行される可能性があります。

あなたはこのサービスで達成しようとしていることを本当に述べていないので、代わりに何をすべきかを言うことは不可能です。サービスが開始されている限りリスナーをアクティブにしたい場合、IntentServiceは適切なツールではありません。カスタム実装を調べる必要があります。

関連する問題