2016-06-19 3 views
0

저는 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에서 출력 된 로그 중 어떤 것도 본 적이 없다.

나는 뭔가 잘못하고 있다고 확신합니다. 감사!

+0

귀하의 앱에는 설치 후 _stopped_ 상태를 벗어나기 위해 적어도 한 번 이상 실행하는 '활동'이 있어야합니다. 그때까지는 부팅 수신기가 브로드 캐스트로 전달되지 않습니다 (API 3.1 이후). –

+0

그래, 내가 액티비티를 추가하면 전화가 다시 시작되는지 상관없이 한 번만 실행하면된다. – CamHart

+0

기본적으로 설치 후 기본적으로 한 번 실행해야한다. 그러나 사용자가 설정에서 앱을 강제 종료하는 등의 _stopped_ 상태로 되돌릴 수 있습니다.이 경우 부트 수신기가 작동하도록 다시 실행해야합니다. 간단하게 재부팅해도 _stopped_ 상태로 되돌아 가지 않습니다. –

답변

0

android.intent.action.BOOT_COMPLETED은 그 이름에서 알 수 있듯이, 이후에 기기 부팅 후에만으로 전송됩니다. 기기를 다시 시작 하시겠습니까? 대신 응용 프로그램을 테스트하기 위해 장치를 다시 시작의

, 당신은 ADB를 통해 직접 시스템 브로드 캐스트를 보낼 수 있습니다

./adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n <your.package.name>/.<YourReceiverClass> 

당신은 더 많은 정보 here를 찾을 수 있습니다.

0
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
     Intent i = new Intent(context, SnapshotService.class); 
     context.startService(i); 
    } 

문자열 안드로이드 3.1에

더 이상 한 가지를 만드는 대신 의도 값을 직접 비교, 어떤 매니페스트 등록 된 브로드 캐스트 리시버 전에 활동 중 하나를 실행해야하는 사용자가 작동합니다. 이것을 확인하십시오 https://stackoverflow.com/a/17067671/3288890

+0

좋은 지적이지만 Log.i ("output", "onReceive occured!"); 절대로 발생하지 않습니다. – CamHart

+0

핸드폰으로 이것을 시도 했습니까? – Adiii

관련 문제