마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 부팅시 서비스 자동실행 조언 부탁드려요

0 추천

FileObserver 함수를 써서  /sdcard0/download 폴더를 모니터링을 해서 이벤트를 잡아보려고 하는데

MainActivity에 선언하면 앱이 실행되어있는 동안 잘 잡아내고... 이제 foregroud로 service 로 앱실행 없이 

부팅시 service를 올려 할려는데 잘 안됩니다. ㅠ 어디서가 잘못됏는지 모르겠어요 

부팅시 브로드캐스트는 잘잡히는데 서비스는 안잡히네요 조언 좀 부탁드려요 

<manifest.xml>

<receiver android:name=".MyBroadcast" android:enabled="true" android:exported="false" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
           <intent-filter android:priority="9999"> <!-- 우선순위 -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
               
            </intent-filter>
            
        </receiver>
        <service android:name=".MyService"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 
<MyBroadcast.java>
 
public class MyBroadcast extends BroadcastReceiver {
private static final String TAG = "FileObserverActivity";
 
@Override
 
    public void onReceive(Context context, Intent intent) {
     Log.d("My Tag","리시버 호출");
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
            Log.d("My Tag","부팅완료");
            Toast.makeText(context, "부팅완료!!", Toast.LENGTH_SHORT).show();
            
            //context.startService(new Intent(context, MyService.class));
            Intent i = new Intent(context, MyService.class);
            context.startService(i);
            /*
            ComponentName comp = new ComponentName(context.getPackageName(),MyService.class.getName());
            ComponentName service = context.startService(new Intent().setComponent(comp));
            */
        }
        
    }
}
 
<MyService.java>
 
public class MyService extends Service{
 
private FileObserver observer;
private static final String pathToWatch = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
private static final String TAG = "FileObserverActivity";
 
 
@Override
public IBinder onBind(Intent intent) {
return null;
}
 
@Override
public void onCreate() {
super.onCreate();
 
Toast.makeText(getBaseContext(), "서비스 시작", Toast.LENGTH_LONG).show();
 
observer = new FileObserver(pathToWatch) {
 
@Override
public void onEvent(int event, String path) {
/*128  : 다운로드 완료시 , usb로 저장시 
*32   : 디렉토리 오픈시
*512  : 파일삭제
*/
 
 
Log.d(TAG, "File Changed --> Path = " + pathToWatch +"/"+ path);
Log.d(TAG, "File Changed --> Event = " + event);
String Save_folder = "/service_test/";
String Save_Path=Environment.getExternalStorageDirectory().getAbsolutePath() + Save_folder;
 
File dir = new File(Save_Path);
if(!dir.exists()){
dir.mkdir();
}
if(event==128){
Log.d(TAG,"야호" + path);
 
 
 
}
}
};
observer.startWatching();
}
 
@Override
public int onStartCommand(Intent intent, int flags, int startId){
super.onStartCommand(intent, flags, startId);
 
// foreground noti 
Notification notification = new Notification(R.drawable.ic_launcher, "서비스 실행됨", System.currentTimeMillis());
notification.setLatestEventInfo(getApplicationContext(), "Screen Service", "Foreground로 실행됨", null);
startForeground(1, notification);
 
return START_REDELIVER_INTENT;
 
}
 
@Override
public void onDestroy(){  
super.onDestroy();
 
 
}
}
 
 
 

 

cansus (200 포인트) 님이 2014년 6월 2일 질문

1개의 답변

0 추천
서비스가 안 죽고 계속 돌게 하고싶으면 startForeground를 호출하세요.
익명사용자 님이 2014년 6월 2일 답변
감사합니다 혹시 startForeground 만 선언하면 다른 문제는 없을까요?
MyService.java 에
public int onStartCommand(Intent intent, int flags, int startId)
안에 startForeground(1, notification); 라고 선언했었네요..;;
왜 그래도 안될까요 ?
MyService.java
에서 onCreate에 있는
String Save_folder = "/service_test/";

String Save_Path=Environment.getExternalStorageDirectory().getAbsolutePath() + Save_folder;

 

File dir = new File(Save_Path);

if(!dir.exists()){

dir.mkdir();
}
폴더 생성이 안될까요 ?
...