Last active
April 6, 2024 12:00
-
-
Save vikrum/6170193 to your computer and use it in GitHub Desktop.
Firebase+Android sample app with background Service + local notifications.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="com.example.bgfirebaseapp" | |
android:versionCode="1" | |
android:versionName="1.0" > | |
<uses-sdk | |
android:minSdkVersion="16" | |
android:targetSdkVersion="17" /> | |
<uses-permission android:name="android.permission.INTERNET" /> | |
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> | |
<application | |
android:allowBackup="true" | |
android:icon="@drawable/ic_launcher" | |
android:label="@string/app_name" | |
android:theme="@style/AppTheme" > | |
<activity | |
android:name="com.example.bgfirebaseapp.MainActivity" | |
android:label="@string/app_name" > | |
<intent-filter> | |
<action android:name="android.intent.action.MAIN" /> | |
<category android:name="android.intent.category.LAUNCHER" /> | |
</intent-filter> | |
</activity> | |
<service | |
android:name=".FirebaseBackgroundService" | |
android:exported="false" | |
android:process=":remote" > | |
<intent-filter> | |
<action android:name="com.example.bgfirebaseapp.FirebaseBackgroundService" /> | |
</intent-filter> | |
</service> | |
<receiver android:name=".StartFirebaseAtBoot" > | |
<intent-filter> | |
<action android:name="android.intent.action.BOOT_COMPLETED" > | |
</action> | |
</intent-filter> | |
</receiver> | |
</application> | |
</manifest> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.bgfirebaseapp; | |
import android.app.Notification; | |
import android.app.NotificationManager; | |
import android.app.PendingIntent; | |
import android.app.Service; | |
import android.content.Context; | |
import android.content.Intent; | |
import android.os.IBinder; | |
import com.firebase.client.DataSnapshot; | |
import com.firebase.client.Firebase; | |
import com.firebase.client.ValueEventListener; | |
public class FirebaseBackgroundService extends Service { | |
private Firebase f = new Firebase("https://somedemo.firebaseio-demo.com/"); | |
private ValueEventListener handler; | |
@Override | |
public IBinder onBind(Intent arg0) { | |
return null; | |
} | |
@Override | |
public void onCreate() { | |
super.onCreate(); | |
handler = new ValueEventListener() { | |
@Override | |
public void onDataChange(DataSnapshot arg0) { | |
postNotif(arg0.getValue().toString()); | |
} | |
@Override | |
public void onCancelled() { | |
} | |
}; | |
f.addValueEventListener(handler); | |
} | |
private void postNotif(String notifString) { | |
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); | |
int icon = R.drawable.ic_launcher; | |
Notification notification = new Notification(icon, "Firebase" + Math.random(), System.currentTimeMillis()); | |
// notification.flags |= Notification.FLAG_AUTO_CANCEL; | |
Context context = getApplicationContext(); | |
CharSequence contentTitle = "Background" + Math.random(); | |
Intent notificationIntent = new Intent(context, MainActivity.class); | |
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); | |
notification.setLatestEventInfo(context, contentTitle, notifString, contentIntent); | |
mNotificationManager.notify(1, notification); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.bgfirebaseapp; | |
import android.app.Activity; | |
import android.content.Intent; | |
import android.os.Bundle; | |
import android.view.Menu; | |
public class MainActivity extends Activity { | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
// Start the background Firebase activity | |
startService(new Intent(FirebaseBackgroundService.class.getName())); | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
// Inflate the menu; this adds items to the action bar if it is present. | |
getMenuInflater().inflate(R.menu.main, menu); | |
return true; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.bgfirebaseapp; | |
import android.content.BroadcastReceiver; | |
import android.content.Context; | |
import android.content.Intent; | |
/** | |
* Start the service when the device boots. | |
* | |
* @author vikrum | |
* | |
*/ | |
public class StartFirebaseAtBoot extends BroadcastReceiver { | |
@Override | |
public void onReceive(Context context, Intent intent) { | |
context.startService(new Intent(FirebaseBackgroundService.class.getName())); | |
} | |
} |
You are calling the service once by receiver and once by main activity is there a chance the same service is started twice?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
One other solution is using server side Firebase Functions
Functions can be implemented to monitor database events and send cloud messages.
Then a FirebaseMessagingService service can be implemented in the Android app to listen for "com.google.firebase.MESSAGING_EVENT" sent from the funtion.
If notification field is set null the message can even awake the service even if system is in doze mode. Best strategy is then to create a notification. Keep it short and exit. Each message will start the service so no wories.
The Cloud message HTTP body sent from the server function would look like this
The AndroidManifest.xml may have the service declared like this:
Full details Set up a Firebase Cloud Messaging client app on Android