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
일:
의 에
<manifest>
요소:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
의 에
<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 브로드캐스트 메시지가 수신되지 않습니다.
이 경우 두 가지 해결책이 있습니다.
- 내부 저장소에 앱 설치
- 내부 저장소에 다른 작은 앱을 설치합니다.이 앱은 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
'sourcetip' 카테고리의 다른 글
파이썬의 내장 정렬() 방식은 어떤 알고리즘을 사용합니까? (0) | 2023.09.25 |
---|---|
웹 응용프로그램에서 시간대 처리 (0) | 2023.09.25 |
구분된 목록을 데이터베이스 열에 저장하는 것이 정말 그렇게 나쁜가요? (0) | 2023.09.25 |
다른 스키마의 사용자에게 권한 부여 (0) | 2023.09.25 |
긴 정수에 대한 최대값 (0) | 2023.09.25 |