마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

어플 강제 재실행하는 법 좀 알려주세요

0 추천
지금 만들고 있는 어플이 항상 켜져있으면 좋겠어서

홈키 막는법을 찾아봤지만 다들 그건 권장되지 않는 방법이라고 하시더라구요

홈키가 눌렸을 경우 강제로 어플이 재실행 되는 방법을 찾아보고 있습니다

강제로 종료되기 전에 하던 작업을 이어나가서 하면 더 좋습니다

검색했을 때는 Service를 사용하는 방법이 주로 나오는 거 같은데 background에서 Service가 죽지 않는다는 내용 같던데 제가 원하는 것은 아닌거 같고 방법이 있을까요??
빈길 (1,220 포인트) 님이 2017년 11월 17일 질문
홈키를 누를때마다 앱이 강제로 실행된다면,
바탕화면(홈화면)으로 가는 방법을 막는 사이드 이펙트가 있습니다.
그러면 다른 앱을 실행할 방법이 없는 거 아닌가요?
이 어플만 사용하려고 만드는 거라 다른 어플은 실행하지 않을거라서요 그 사이드 이펙트는 어떻게 사용하는 건가요??
사이드 이펙트는 "예상치 못한 결과"를 이야기 하는 것입니다.
흠... 체크해 보죠.

3개의 답변

0 추천
 
채택된 답변
홈키가 아니래도 다른 게 위에 뜰 때도 있죠.

그래서 해당 패키지나 해당 액티비티가 포그라운드 상태인지를 확인해서 아니면 다시 띄워주면 됩니다.
예외 상황이 발생할 수도 있습니다. 예를들면 사용자가 앱을 강제로 죽였을 경우?
이런 경우엔 하단의 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를 띄워 주면 됩니다.
Will Kim (33,850 포인트) 님이 2017년 11월 17일 답변
빈길님이 2017년 11월 21일 채택됨
0 추천
특정 앱만 실행하는 전용 단말기라면 그 앱을 홈앱으로 만들면 되지 않을까 싶네요

메니페스트에 아래 intent-filter 만 지정하면 홈앱으로 지정할 수 있습니다.

다만 이렇게 되면 앱관리자가 없어지므로 앱에서 설정으로 들어가는 기능 정도는 해주시거나 adb 로 설정에 들어가야 하는 번거로웁이 있습니다

   <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
jerome.lee (160 포인트) 님이 2017년 11월 17일 답변
0 추천
익명사용자 님이 2017년 11월 17일 답변
...