-
-
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