sourcetip

Android에서 부팅 시 서비스를 시작하려고 합니다.

fileupload 2023. 9. 25. 22:55
반응형

Android에서 부팅 시 서비스를 시작하려고 합니다.

안드로이드에서 기기가 부팅되면 서비스를 시작하려고 했지만 작동이 되지 않습니다.여러 링크를 온라인으로 찾아봤지만 코드가 작동하지 않습니다.제가 뭔가를 잊어버린 건가요?

Android Manifest.xml

<receiver
    android:name=".StartServiceAtBootReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action._BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<service
    android:name="com.test.RunService"
    android:enabled="true" />

브로드캐스트 리시버

public void onReceive(Context context, Intent intent) {
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
        Intent serviceLauncher = new Intent(context, RunService.class);
        context.startService(serviceLauncher);
        Log.v("TEST", "Service loaded at start");
    }
}

다른 답변들은 좋아 보이지만, 저는 모든 것을 하나의 완전한 답변으로 마무리 지을 것이라고 생각했습니다.

당신은 당신의 안에 다음 사항들이 필요합니다.AndroidManifest.xml일:

  1. 의 에<manifest>요소:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  2. 의 에<application>소에 된 [춘 대]하십시오).BroadcastReceiver):

    <receiver android:name="com.example.MyBroadcastReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
    

    없습니다.android:enabled,exported , : Android )

    MyBroadcastReceiver.java:

    package com.example;
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent startServiceIntent = new Intent(context, MyService.class);
            context.startService(startServiceIntent);
        }
    }
    

원래 질문에서:

  • 당신이 그 일을 하고 있는지는 확실하지 않습니다.<receiver>.<application>
  • (인)의 클래스 이 하는지 하지 않습니다.BroadcastReceiver되었습니다 지정되었습니다.
  • 에 .<intent-filter>

추가 정보: BOOT_COMPLETE는 외부 스토리지를 마운트하기 에 애플리케이션으로 전송됩니다.따라서 애플리케이션이 외부 스토리지에 설치되어 있으면 BOOT_COMPLETE 브로드캐스트 메시지가 수신되지 않습니다.

자세한 내용은 여기 "부팅 완료"를 청취하는 브로드캐스트 수신기 섹션에서 확인할 수 있습니다.

디바이스 부팅 시 서비스 시작 방법(앱 자동 실행 등)

첫 번째: 안드로이드 3.1+ 버전 이후로 사용자가 앱을 한 번이라도 시작하지 않았거나 사용자가 애플리케이션을 "강제로 닫은" 경우에는 BOOT_COMPLETE를 받지 못합니다.이는 멀웨어가 서비스를 자동으로 등록하는 것을 방지하기 위한 것입니다.이 보안 구멍은 Android의 최신 버전에서는 닫혔습니다.

해결책:

액티비티가 있는 앱을 만듭니다.사용자가 실행하면 앱에서 BOOT_COMPLETE 브로드캐스트 메시지를 받을 수 있습니다.

둘째: BOOT_COMPLETE는 외부 스토리지를 마운트하기 전에 전송됩니다.앱이 외부 저장소에 설치되어 있으면 BOOT_COMPLETE 브로드캐스트 메시지가 수신되지 않습니다.

이 경우 두 가지 해결책이 있습니다.

  1. 내부 저장소에 앱 설치
  2. 내부 저장소에 다른 작은 앱을 설치합니다.이 앱은 BOOT_COMPLETE를 받고 외부 스토리지에서 두 번째 앱을 실행합니다.

앱이 이미 내부 저장소에 설치되어 있는 경우 아래 코드를 통해 장치 부팅 시 서비스를 시작하는 방법을 이해할 수 있습니다.


Manifest.xml에서

권한:

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

BOOT_COMPLETE 수신기 등록:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

서비스를 등록합니다.

<service android:name="org.yourapp.YourCoolService" />

수신기 OnBoot.java에서:

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

HTC의 경우 장치가 REQUE_B를 잡지 못하면 매니페스트에 이 코드를 추가해야 할 수도 있습니다.OOT_COMPLETE 완료:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

이제 수신기는 다음과 같습니다.

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

에뮬레이터나 실제 장치를 다시 시작하지 않고 BOOT_COMPLETED를 테스트하는 방법은?쉬워요.시도해 보기:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

디바이스 ID를 가져오는 방법?ID가 있는 연결된 장치 목록 가져오기:

adb devices

ADT의 adb는 기본적으로 다음에서 확인할 수 있습니다.

adt-installation-dir/sdk/platform-tools

맛있게 드세요! )

와 함께

<action android:name="android.intent.action.BOOT_COMPLETED" />  

또한 사용,

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

HTC 디바이스가 BOOT_COMPLETED를 잡지 못하는 것 같습니다.

질문의 첫머리에 오타가 있습니다.

<action android:name="android.intent.action._BOOT_COMPLETED"/>

대신:

<action android:name="android.intent.action.BOOT_COMPLETED"/>

하나의 작은 "_" 그리고 이 모든 문제들 :)

당신의 성명서는 다음을 추가해야 한다고 생각합니다.

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

요 걸 요. 그 이유는Fast Boot에서의 옵션Settings>Power

이 옵션을 해제하면 응용 프로그램이 이 브로드캐스트를 수신하지만 그렇지 않은 경우에는 수신되지 않습니다.

가 요, 는.Android 2.3.3위에HTC Incredible S.

도움이 되길 바랍니다.

언급된 모든 답변과 요령을 시도해 본 후, 저는 마침내 제 핸드폰에서 코드가 작동하지 않는 이유를 알게 되었습니다."Huawei Honor 3C Android 4.2.2"와 같은 일부 Android 폰은 설정에 Statup Manager 메뉴가 있으며 목록에서 앱을 확인해야 합니다. :)

가 하나 더 .<category>-태그, 그게 무슨 차이가 있는지 모르겠어요.

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

절 if 절 를?"android.intent.action.BOOT_COMPLETED".equals(intent.getAction() 수신자가 의도만 에?

이것이 제가 한 일입니다.

1. 나는 리시버 클래스를 만들었습니다.

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //whatever you want to do on boot
       Intent serviceIntent = new Intent(context, YourService.class);
       context.startService(serviceIntent);
    }
}

2.in 더 매니페스트

<manifest...>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <application...>
        <receiver android:name=".BootReceiver" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    ...

3.MainActivity에서 수신기를 "설정"하기만 하면 onCreate 안에 있을 수 있습니다.

...
 final ComponentName onBootReceiver = new ComponentName(getApplication().getPackageName(), BootReceiver.class.getName());
        if(getPackageManager().getComponentEnabledSetting(onBootReceiver) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED)
        getPackageManager().setComponentEnabledSetting(onBootReceiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
...

내가 ApiDemos로부터 배운 마지막 단계.

서비스 시 부팅을 사용하려면 이 링크 http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html 단계별 절차를 참조하십시오.

Android Studio를 사용하고 있고 자동 완성을 매우 좋아하신다면 알려드리겠습니다. 저는 Android Studio v 1.1.0을 사용하고 있으며 다음 권한으로 자동 완성을 사용했습니다.

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

자동 Android Studio RECEIVE_BOOT_COMPLETED로,e처럼receive_boot_completed그리고 서비스를 시작하기 위해 해야 할 일들에 대한 체크리스트를 이미 체크했기 때문에 계속 머리를 뽑았습니다.했습니다 다시 했습니다.

Android Studio는 소문자로 이 권한을 자동으로 완료합니다.

@Damian이 언급한 것처럼 이 스레드의 모든 답변이 잘못되고 있습니다.이와 같이 수동으로 수행하면 기기가 절전 모드에 들어가는 도중에 서비스가 중단될 위험이 있습니다.웨이크 락을 먼저 구하셔야 합니다.다행히 지원 라이브러리에서 다음과 같은 작업을 수행할 수 있는 클래스를 제공합니다.

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);

        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}

그런 다음 서비스에서 웨이크 록을 해제해야 합니다.

    @Override
    protected void onHandleIntent(Intent intent) {
        // At this point SimpleWakefulReceiver is still holding a wake lock
        // for us.  We can do whatever we need to here and then tell it that
        // it can release the wakelock.

...
        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

메인페스트에 WAKE_LOCK 권한을 추가하는 것도 잊지 마십시오.

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

사실 얼마 전에 이런 문제가 생겼어요. 정말 쉽게 고칠 수 있어요. 당신이 그 문제를 설정하면 당신은 아무 잘못도 안 해요."android.intent.action.BOOT_COMPLETED"허가 및 의도 필터입니다.

Android 4.X에서는 부팅 시 서비스를 시작하기 전에 브로드캐스트 리스너를 실행해야 합니다. 즉, 먼저 작업을 추가해야 합니다. 일단 방송 수신기가 실행되면 앱이 예상대로 작동합니다. 그러나 Android 4.X에서는 아무런 작업 없이 부팅 시 서비스를 시작할 방법을 찾지 못했습니다.구글은 보안상의 이유로 그렇게 한 것 같습니다.

리시버 클래스에 빈 컨스트럭터를 두면 이 문제가 발생했습니다.Rreceive에서 빈 컨스트럭터를 제거한 후 메소드가 정상적으로 작동하기 시작했습니다.

언급URL : https://stackoverflow.com/questions/2784441/trying-to-start-a-service-on-boot-on-android

반응형