How to create a service like that?
- Create a Notification channel
public class MyApp extends Application { public static final String CHANNEL_ID = "autoStartServiceChannel"; public static final String CHANNEL_NAME = "Auto Start Service Channel"; @Override public void onCreate() { super.onCreate(); createNotificationChannel(); } private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel serviceChannel = new NotificationChannel( CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT ); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(serviceChannel); } } }
- Create a Service and call a local notification with startForeground
public class AutoStartService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { String input = intent.getStringExtra("inputExtra"); Intent notificationIntent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); Notification notification = new NotificationCompat.Builder(this, MyApp.CHANNEL_ID) .setContentTitle("Auto Start Service") .setContentText(input) .setSmallIcon(R.drawable.ic_launcher_background) .setContentIntent(pendingIntent) .build(); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( MyApp.CHANNEL_ID, MyApp.CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); mNotificationManager.createNotificationChannel(channel); new NotificationCompat.Builder(this, MyApp.CHANNEL_ID); } startForeground(1, notification); return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
- Start the above service with startForegroundService
Intent serviceIntent = new Intent(this, AutoStartService.class); serviceIntent.putExtra("inputExtra", "passing any text"); ContextCompat.startForegroundService(this, serviceIntent);
- Create a BroadcastReceiver to start the service with startForegroundService
public class AutoStartReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(context, AutoStartService.class); serviceIntent.putExtra("inputExtra", "passing any text"); ContextCompat.startForegroundService(context, serviceIntent); } }
- Add the following into AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:name=".MyApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApp"> <receiver android:name=".AutoStartReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name=".AutoStartService" android:enabled="true" android:exported="true" /> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
https://github.com/hung-nb/android-foreground-service
How to keep service running while screen off?
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); wl.acquire(); // ..cpu will stay running on during this section.. wl.release();
if you want to keep your service always running, acquire your lock in onStartCommand()
and release in onDestroy()
Leave a Reply