2016-06-10 25 views
4

我试图做一个后台服务,即使应用程序关闭也能运行。此服务应该侦听Firebase更改,并根据触发器启动应用程序。我不知道我是否缺少代码的东西或者甚至还没有接近正确的答案,但这里是我的代码:如何在Android中使用Firebase EventListener作为后台服务?

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> 

编辑:我加入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中的服务pplication如下:

  1. 的服务类扩展活动和不服务
  2. 我添加应用程序标记内清单中的服务直接作为以下内容:

机器人:名称=” 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分钟才能触发。