홈키가 아니래도 다른 게 위에 뜰 때도 있죠.
그래서 해당 패키지나 해당 액티비티가 포그라운드 상태인지를 확인해서 아니면 다시 띄워주면 됩니다.
예외 상황이 발생할 수도 있습니다. 예를들면 사용자가 앱을 강제로 죽였을 경우?
이런 경우엔 하단의 service를 foreground service로 만들면 안죽습니다.
foreground 서비스 만드는법 등의 강좌가 많으므로 그런 것을 참고로 해서 발전시켜 나가면 됩니다.
일종의 런처 앱이 되는 거죠. 화면을 항상 장악하고, 거기서만 관리될 수 있게 하는, 단말의 메인 액티비티인 거죠.
먼저 부팅할 때 Activity를 자동 실행하도록 해야 합니다.
https://stackoverflow.com/questions/6391902/how-do-i-start-my-app-on-startup
그리고 Service를 하나 아래처럼 만듭니다.
package com.appcognito.secretfiles;
import android.app.ActivityManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.List;
/**
* Created by WillKim on 17/11/2017.
*/
public class detectForeground extends Service {
@Override
public void onCreate() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 주기적으로 스캔함.
final Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
@Override
public void run() {
handler1.postDelayed(this, 1000); // 딜레이
boolean ret = isForeground("com.yourpackage.name");
Log.i("detectForeground", "isForeground: " + ret);
}
}, 1000);
return START_NOT_STICKY;
}
@Override
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
super.dump(fd, writer, args);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
}
public boolean isForeground(String myPackage) {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1);
ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
return componentInfo.getPackageName().equals(myPackage);
// 만약 특정 Activity를 하고 싶다면 아래를 사용
// return componentInfo.getClassName().equals(myPackage);
}
}
그럼 로그캣에 앱이 foreground가 아니면 isForeground: false라고 뜹니다.
false일때, activity를 띄워 주면 됩니다.