-
-
Save vikrum/6170193 to your computer and use it in GitHub Desktop.
| <?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> |
| 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); | |
| } | |
| } |
| 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; | |
| } | |
| } |
| 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())); | |
| } | |
| } |
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
{
"registration_ids":[
"user_token_0_here", "user_token_n_here", "and so on"
],
"notification":null,
"data":{
"par1":"AAA",
"par2":"BBB",
"par3":"CCC"
},
"android":null,
"webpush":null,
"priority":10
}
The AndroidManifest.xml may have the service declared like this:
<service
android:name=".SimpleFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
Full details Set up a Firebase Cloud Messaging client app on Android
You are calling the service once by receiver and once by main activity is there a chance the same service is started twice?

Hi @gthb619 @vikrum,
Thank you to share your knowledge with us. I am just confuse on this point what to do and follow.
Like as you said follow this
Use this
startService(new Intent(this, FirebaseBackgroundService.class));instead of this
startService(new Intent(FirebaseBackgroundService.class.getName()));StartFirebaseAtBoot.java:
Use this
context.startService(new Intent(context, FirebaseBackgroundService.class));instead of this
context.startService(new Intent(FirebaseBackgroundService.class.getName()));So, to follow above mentioned suggestion by @gthb619 does I have to remove this
Someone can tell me what is the right way to do nowadays.
Thank you