Solution 1 :
How do I made a thread that is always running even is the app is closed for android?
You don’t – you cannot create an ever-lasting background service on Android.
Please review the docs on background work and use a more appropriate tool for your task at hand (restartable Service / Foreground Service / WorkManager / etc).
https://developer.android.com/guide/background
Hope that helps!
Solution 2 :
You can make a trick to do this, first, you have to use foreground service instead of background service because OS kills background service in memory lack. second, you have to re-run this service after restart system using the broadcast receiver, third you have to getting some permissions in some devices like Huawei’s phones.
Problem :
I’m trying too make a service that is running even if the app is closed (if you open the app list and tap clear all) the thread with the while loop is still running. Anyone know how to do that?
So here is what I currently have:
In my AndroidManifest.xml
<service
android_name=".SilentService"
android_enabled="true"
android_exported="false"/>
SilentService.java
public class SilentService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
//the good stuff
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
this is called by MainActivity.java using
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//some ui stuff
if (!isServiceRunning(SilentService.class)) {
startService(new Intent(this, SilentService.class));
}
}
private boolean isServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
Comments
Comment posted by developer.android.com/guide/components/services
You want a foreground service: