시작시 앱을 어떻게 시작합니까?


241

링크 에서 샘플 코드를 사용해 보았지만 구식이며 작동하지 않습니다. Android 부팅이 완료되면 앱에서 자동으로 시작하도록 변경해야 할 사항과 파일을 변경해야합니까?

답변:


315

먼저, 당신은 당신의 권한이 필요합니다 AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

또한에서 AndroidManifest.xml서비스를 정의하고 BOOT_COMPLETED 작업을 수신하십시오 .

<service android:name=".MyService" android:label="My Service">
    <intent-filter>
        <action android:name="com.myapp.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

그런 다음 BOOT_COMPLETED 조치를 가져 오고 서비스를 시작할 수신자를 정의 해야합니다.

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            context.startService(serviceIntent);
        }
    }
}

이제 전화가 시작될 때 서비스가 실행되고 있어야합니다.


8
활동 : developer.android.com/guide/topics/fundamentals/activities.html 서비스 : developer.android.com/guide/topics/fundamentals/services.html 전화가 실제로 시작될 때 애플리케이션을 시작하려면 다음을 수행해야합니다. 위에 표시된대로 서비스를 등록한 다음 startActivity ()를 사용하여 앱을 시작할 수 있습니다. 그러나 사용자가 요청하지 않은 경우 화면을 사용자 앞에 놓는 것은 좋지 않습니다.
Sean Schulte

19
Intent.ACTION_BOOT_COMPLETED리시버에서 문자열을 하드 코딩하는 대신 사용 하는 것이 더 좋습니다 . 또한 인 Intent(context, MySystemService.class)텐트를 만들 때 새 생성자를 사용해야합니다 .
brianestey

7
인 텐트 필터를 사용하는 경우 인 텐트 유형을 확인해야하는 이유가 있습니까?
Pijusn

1
어떤 이유로 메신저지고 Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filepublic class라인. 어떤 아이디어?
pattyd

3
MySystemService 란 무엇입니까?
스포츠

120

이것은 안드로이드 장치 재부팅 후 활동을 시작하는 방법입니다 .

당신이 코드를 삽입 AndroidManifest.xml내 파일 <application>요소 ( 하지<activity>요소) :

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver
    android:enabled="true"
    android:exported="true" 
    android:name="yourpackage.yourActivityRunOnStartup"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>

그런 다음 매니페스트 의 요소에 지정된 것과 yourActivityRunOnStartup일치 하는 새 클래스를 만듭니다 .android:name<receiver>

package yourpackage;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class yourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

}

참고 : i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);활동은 활동 외부의 컨텍스트에서 시작되므로 호출 이 중요합니다. 이것이 없으면 활동이 시작되지 않습니다.

또한, 값 android:enabled, android:exportedandroid:permission<receiver>태그는 필수 보이지 않는다. 앱은 이러한 값없이 이벤트를받습니다. 여기 의 예를 참조 하십시오 .


나는이 "바로 가기"를 좋아하여 지역 서비스를하지 않아도됩니다. 그 코드는 확장하는 클래스에 속합니까 Application? 아마 안에 onCreate()?
누군가 어딘가에

2
코드의 단락 이내 일 것 것 같습니다 onReceive()BroadcastReceiver
어딘가의 누군가가

2
이 코드는 "ReceiveActivityrRunOnStartup"활동에 있어야하며 BroadcastReceiver 클래스를 확장하고 onReceive () 메소드 안에 있어야합니다.
thrylos

2
나는 10 upvotes를 제공하려고했지만 할 수 없었습니다. 미안하고 고마워
Sayka

1
이것은 나를 위해 일했지만 인 텐트 필터에 "<action android : name ="android.intent.action.BOOT_COMPLETED "/>"만있는 경우에만 효과가있었습니다. 다른 두 가지를 사용하면 작동하지 않았습니다.
emhomm4

67

ACTION_BOOT_COMPLETE을 (를) 청취하고 필요한 작업을 수행하십시오. 여기에 코드 스 니펫이 있습니다.

최신 정보:

답변에 대한 원래 링크가 다운되었으므로 주석을 기반으로 링크가 다운되었을 때 아무도 코드를 놓치지 않기 때문에 링크 된 코드입니다.

AndroidManifest.xml (application-part)에서 :

<receiver android:enabled="true" android:name=".BootUpReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</receiver>

...

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

...

public class BootUpReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, MyActivity.class);  //MyActivity can be anything which you want to start on bootup...
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);  
        }

}

출처 : https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup


공용 클래스 BootUpReceiver가 브로드 캐스트 리시버 확장 : 배치이 코드 어떤 파일입니다
제프 제인

작동합니다, 감사합니다! (Android 4.0.4 API 레벨 15에서 작동). 그렇다. 2017 년인데 안드로이드 4.0.4 용으로 개발해야한다. :(
Luca

2
안드로이드 8.0에서는 작동하지 않습니다! 그래도 안드로이드 4.0에서 작동합니다.
codezombie

나는 같은 코드를 사용하고 있지만 kitkat 버전까지 작동하지 않습니다. 나는 안드로이드 TV가 시작될 때 응용 프로그램을 시작하고 싶습니다
Ashutosh Tripathi

@AshutoshTripathi이 문제를 해결 했습니까?
ralphgabb 2016 년

10

또한 코드를 수정하지 않으려는 경우 자동 시작과 같은 응용 프로그램을 사용하여 시작할 때 Android 응용 프로그램을 시작할 수 있습니다. 자동 시작 -루트 없음


2

Sean의 솔루션이 처음에는 작동하지 않았습니다 (Android 4.2.2). 동일한 Android 프로젝트에 더미 활동을 추가하고 최소한 한 번은 장치에서 활동을 수동으로 실행해야했습니다. 그런 다음 Sean의 솔루션이 작동하기 시작했으며 이후 재부팅 후 BroadcastReceiver에 알 렸습니다.


0

스크린 샷

이 질문에 며칠 동안 직면 한 점을 추가하고 싶습니다. 나는 모든 대답을 시도했지만 그게 효과가 없었습니다. Android 버전 5.1을 사용중인 경우이 설정을 변경하십시오.

Android 버전 5.1을 사용하는 경우 앱 설정에서 (시작 제한)을 선택 해제해야합니다.

설정> 앱> 앱> 실행 제한 (선택 해제)


3
나는 이것이 표준이라고 생각하지 않습니다. "출발 제한"에 대해 들어 본 적이 없습니다. 다른 Samsung, Asus, Sony에서 본 적이 없습니다. 앱만 시작할 수 있다고 말합니다. 이것은 무엇을 의미 하는가?
놀라운 1

0

다른 접근 방식은 부팅 과정에서 속도 저하를 피하기 위해 android.intent.action.USER_PRESENT대신에 사용하는 것입니다 android.intent.action.BOOT_COMPLETED. 그러나 이것은 true사용자가 잠금 화면을 활성화 한 경우 에만 해당 됩니다. 그렇지 않으면이 의도가 브로드 캐스트되지 않습니다.

참조 블로그 -Android ACTION_USER_PRESENT 의도의 문제


그래서, 다른 말로하면, 그것은 사용하지 않아야합니다
behelit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.