2016-06-10 2 views
4

Я пытаюсь сделать фоновое обслуживание, которое выполняется, даже если приложение закрыто. эти службы должны прослушивать изменения Firebase и запускать приложение в соответствии с триггером. Я не знаю ли я что-то в коде или даже не близко к правильному ответу не хватает, но вот мой код:Как использовать Firebase EventListener в качестве фоновой службы в android?

public class FireBaseService extends Service { 

private HashMap<String, String> fireBaseBattery; 

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

    fireBaseBattery = new HashMap<>(); 
    final Firebase firebaseRef_Battery = new Firebase("the url i want to take data from"); 

    firebaseRef_Battery.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.getValue() != null) { 
       fireBaseBattery = (HashMap<String, String>) dataSnapshot.getValue(); 
       String battery = (String) fireBaseBattery.get("battery"); 
       int battery_int = Integer.parseInt(battery); 

       System.out.println("SERVICE FIREBASE : " + battery); 
       if (battery_int <= 10) { 
        Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
        startActivity(intent); 
       } 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 

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

}

И это проявляется:

<uses-permission android:name="android.permission.READ_SMS" /> 
    <application 
     android:name=".ParseApplication" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

<service android:enabled="true" 
     android:name=".FireBaseService"> 
    </service> 
     <activity 
      android:name=".Launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

Edit: я добавил строку в MainActivity.class запустить службу

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    startService(new Intent(this, FireBaseService.class)); 
} 
+0

добавить свою службу в тег приложения – Shubhank

+0

Я сделал, но это не сработало – MuhammadNe

+0

отладка, если ваша служба запускается, и в ней выполняется код. – Shubhank

ответ

1

Я редактировал A РИМЕНЕНИЕ следующим образом:

класс
  1. Служба расширяет активность и Сервис
  2. Я добавил службу манифеста внутри тега приложения непосредственно как следующее:

андроида:. имя =»FireBaseService "

  1. Нет необходимости запускать услугу из основного вида деятельности.

Edited Manifest:

<uses-permission android:name="android.permission.READ_SMS" /> 
<application 
    android:name=".FireBaseService" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <activity 
     android:name=".Launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

0

То, что вы хотите, это просто startForeground вы можете это сделать. По соображениям безопасности пользователь должен знать, что что-то работает в фоновом режиме.

0

Я думаю, что я его взломал.

я решил его с помощью ребенка событием слушателя и липкого обслуживанием. Вот как это происходит:

Я сначала добавить прослушиватель событий ребенок в моем хранилище данных класса:

class DataStore { 

     private static DataStore sDataStore; 
     private List<EmergencyZoneEventListener> mEmergencyZoneEventListeners = null; 

     static DataStore get() { 
      if (sDataStore == null) { 
       sDataStore = new DataStore(); 
      } 

      return sDataStore; 
     } 

     void addEmergencyZoneEventListener(EmergencyZoneEventListener emergencyZoneEventListener) { 
      if (emergencyZoneEventListener != null && !sDataStore.mEmergencyZoneEventListeners.contains(emergencyZoneEventListener)) { 
       sDataStore.mEmergencyZoneEventListeners.add(emergencyZoneEventListener); 
      } 
     } 

     void removeEmergencyZoneEventListener(EmergencyZoneEventListener emergencyZoneEventListener) { 
      mEmergencyZoneEventListeners.remove(emergencyZoneEventListener); 
     } 

     DataStore() { 
      FirebaseDatabase.getInstance().getReference("/emergencyZones/"). 
        addChildEventListener(new ChildEventListener() { 
         @Override 
         public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
          emergencyZoneAddedOrChangedRemotely(dataSnapshot); 
         } 

         @Override 
         public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
          emergencyZoneAddedOrChangedRemotely(dataSnapshot); 
         } 

         @Override 
         public void onChildRemoved(DataSnapshot dataSnapshot) { 
          emergencyZoneRemovedRemotely(dataSnapshot); 
         } 

         @Override 
         public void onChildMoved(DataSnapshot dataSnapshot, String s) { } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 
          Log.w(TAG, "onCancelled: " + databaseError.getMessage() + ": " 
            + databaseError.getDetails()); 
         } 
        }); 
     } 
    } 

А вот что происходит в emergencyZoneAddedOrChangedRemotely:

private void emergencyZoneAddedOrChangedRemotely(DataSnapshot dataSnapshot) { 
     EmergencyZone ez = dataSnapshot.getValue(EmergencyZone.class); 
     if (ez == null || ez.getKey() == null) { 
      Log.w(TAG, "emergencyZoneAddedRemotely: EmergencyZone or getKey is null"); 
      return; 
     } 

     for (EmergencyZoneEventListener listener : mEmergencyZoneEventListeners) { 
      listener.onEmergencyZoneAdded(ez); 
     } 
    } 

Здесь каждый время, которое происходит в Firebase, и Firebase запускает мой ChildEventListener. Я, в свою очередь, запускаю свои локально подключенные слушатели, используя listener.onEmergencyZondeAdded.

И, наконец, липкое обслуживание:

public class NotificationService extends Service { 

    private static final String TAG = "NotificationService"; 

    private DataStore mDataStore; 
    private DataStore.EmergencyZoneEventListener mEmergencyZoneEventListener = new DataStore.EmergencyZoneEventListener() { 
     @Override 
     public void onEmergencyZoneAdded(EmergencyZone emergencyZone) { 
      Log.i(TAG, "onEmergencyZoneAdded: " + emergencyZone.getKey()); 
     } 

     @Override 
     public void onEmergencyZoneChanged(EmergencyZone emergencyZone) { 
      Log.i(TAG, "onEmergencyZoneChanged: " + emergencyZone.getKey()); 
     } 

     @Override 
     public void onEmergencyZoneRemoved(EmergencyZone emergencyZone) { } 
    }; 

    public static Intent getIntent(Context packageContext) { 
     return new Intent(packageContext, NotificationService.class); 
    } 

    @Override 
    public void onCreate() { 
     Log.i(TAG, "onCreate: NotificationService is being created..."); 
     mDataStore = DataStore.get(this); 
     mDataStore.addEmergencyZoneEventListener(mEmergencyZoneEventListener); 
     QueryPreferences.setIsNotificationsOn(this, true); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i(TAG, "onStartCommand: Received start id " + startId + ": " + intent); 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     Log.i(TAG, "onDestroy: NotificationService is being destroyed..."); 
     mDataStore.removeEmergencyZoneEventListener(mEmergencyZoneEventListener); 
     QueryPreferences.setIsNotificationsOn(this, false); 
    } 

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

Я проверил это решение, когда приложение было вышло, и когда телефон спит, и он работал аккуратно. Когда я закрыл приложение из диспетчера задач, служба не уничтожалась, а воссоздавалась и продолжала получать удаленные изменения.

Надеюсь, это поможет.

Примечание. Мои обратные вызовы могут занять до 5 минут, чтобы их уволили после фактических изменений в базе данных firebase.

Смежные вопросы