저는 Android 개발에 익숙하지 않아 백그라운드 서비스로 실행되는 간단한 "개념 증명 응용 프로그램"을 만들려고합니다. IntentService를 BroadcastReceiver와 함께 사용하여 프로세스를 시작하려고합니다. (부팅 시간 중에는 현재/현재 사용자 화면으로 전환 할 수 있습니다.)왜 내 BroadcastReceiver가 Android 에뮬레이터에서 시작하지 않습니까?
나는 활동이없는 Android Studio 내에서 새 프로젝트를 만들었습니다. 다음 Java 파일을 추가하고 AndroidManifest.xml을 다음과 같이 변경했습니다.
는 AndroidManifest.xml에
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.circlesquires.netcountable.netcountable">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
</uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service android:name=".SnapshotService" android:exported="true">
</service>
<receiver android:name=".ServiceStarter" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
ServiceStarter.java
package com.circlesquires.netcountable.netcountable;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by camha on 6/18/2016.
*/
public class ServiceStarter extends BroadcastReceiver{
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
Log.i("output", "onReceive occured!");
if(intent.getAction().equals(ACTION)) {
Intent serviceIntent = new Intent(context, SnapshotService.class);
context.startService(serviceIntent);
}
}
}
SnapshotService.java는
package com.circlesquires.netcountable.netcountable;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
/**
* Created by camha on 6/18/2016.
*/
public class SnapshotService extends IntentService {
public SnapshotService() {
super("SnapshotService");
}
@Override
protected void onHandleIntent(Intent workIntent) {
while(true) {
Log.i("output", "I'm running!");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
본인은 "디버그"버튼을 클릭해야되는 에뮬레이터에 응용 프로그램을 배포 . 그러나 나는 logcat에서 출력 된 로그 중 어떤 것도 본 적이 없다.
나는 뭔가 잘못하고 있다고 확신합니다. 감사!
귀하의 앱에는 설치 후 _stopped_ 상태를 벗어나기 위해 적어도 한 번 이상 실행하는 '활동'이 있어야합니다. 그때까지는 부팅 수신기가 브로드 캐스트로 전달되지 않습니다 (API 3.1 이후). –
그래, 내가 액티비티를 추가하면 전화가 다시 시작되는지 상관없이 한 번만 실행하면된다. – CamHart
기본적으로 설치 후 기본적으로 한 번 실행해야한다. 그러나 사용자가 설정에서 앱을 강제 종료하는 등의 _stopped_ 상태로 되돌릴 수 있습니다.이 경우 부트 수신기가 작동하도록 다시 실행해야합니다. 간단하게 재부팅해도 _stopped_ 상태로 되돌아 가지 않습니다. –