2016-06-10 4 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> 

편집 : 나는이 (가) 편집

@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

서비스를 시작 MainActivity.class의 라인을 추가

  1. 서비스 클래스가 활동을 확장하고 난 다음 바로 같은 응용 프로그램 태그 내부 매니페스트 서비스 추가
  2. 수리하지 :

안드로이드 : 다음과 같이 pplication. 이름을 = "FireBaseService "

  1. 주요 활동에서 서비스를 시작할 필요가 없습니다.

편집 매니페스트 :

당신이 원하는 무엇
<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; 
    } 
} 

나는이 솔루션을 테스트 전화 자고 때 그것을 깔끔하게했다. 작업 관리자에서 응용 프로그램을 닫았을 때 서비스가 손상되지는 않았지만 재 작성되어 계속 원격 변경 사항을 수신했습니다.

희망이 있습니다.

참고 : 내 콜백은 firebase 데이터베이스의 실제 변경 사항에 따라 해고되기까지 최대 5 분이 소요될 수 있습니다.