2012-03-31 2 views
1

나는 서비스 클래스와 활동이있는 앱을 작성했습니다. 연락처 데이터베이스의 변경 사항을 수신하는 24X7 백그라운드에서 앱을 실행하는 방법

내가이

public class RecycleBinActivity extends Activity { 


    /** Called when the activity is first created. */ 


    Uri cpath=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     cpath=ContactsContract.Contacts.CONTENT_URI; 
     this.getApplicationContext().getContentResolver().registerContentObserver(cpath, true, observer); 

    } 
    private class MyContentObserver extends ContentObserver { 

     public MyContentObserver() { 
      super(null); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
     Intent i=new Intent(RecycleBinActivity.this.getApplicationContext(),DeleteService.class); 
     startService(i); 
    } 
     @Override 
     public boolean deliverSelfNotifications() 
     { 
      super.deliverSelfNotifications(); 
      return true; 

     } 

    } 
    MyContentObserver observer=new MyContentObserver(); 

} 

같은 활동에서 서비스를 시작하고 내 서비스 구현은 처음 에 대한 알림을 표시 연락처를 내가이 응용 프로그램을 실행할 때

public class DeleteService extends Service { 

    private final IBinder mBinder = new LocalBinder(); 
    Notification nf; 
    NotificationManager nfm; 
    Uri cpath,lookupuri; 
    String lookupkey; 
    Cursor cur; 
    Runnable refresher; 
    ContentResolver cr; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return mBinder; 
    } 
    @Override 
    public void onCreate() { 

     cpath=ContactsContract.Contacts.CONTENT_URI; 


         // some action 

       nfm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 
        int NOTIFICATION_ID = 1; 
      Intent intent = new Intent(); 
      PendingIntent pi = PendingIntent.getActivity(DeleteService.this, 1, intent, 0); 
      nf=new Notification(R.drawable.ic_launcher,"Contact Database changed",System.currentTimeMillis()); 
      nf.setLatestEventInfo(getApplicationContext(), "Delete Event", "contact name", pi); 
      nf.flags = nf.flags | 
        Notification.FLAG_ONGOING_EVENT; 
        startForeground(NOTIFICATION_ID, nf); 

      } 






    @Override                                                                                                                                                                                                                                                                                                                             
    public void onDestroy() { 

    } 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Launch a background thread to do processing. 
     super.onStartCommand(intent, flags, startId); 
    return Service.START_STICKY; 
    } 
    public class LocalBinder extends Binder { 
      DeleteService getService() { 
       return DeleteService.this; 
      } 

    } 
} 

아래와 같이 수정한다 내가 몇 초 안에 수정을했다면 아무 것도 도와 줄 수 없다. 왜 아무도 도와주지 못한다.

답변

2

onCreate 메서드는 일반적으로 한 번 호출됩니다.

실제로 메모리가 부족할 경우 OS에서이를 죽일 수 있으므로 앱이 연중 무휴로 작동한다는 보장은 없습니다. 물론 서비스가 "끈적"이라면 다시 만들어집니다 (거의 24x7입니다).

+0

부팅을 시작할 수있는 기능이있는 전경 서비스는 다소 24X7 서비스입니다. –

2

변경할 때마다 발생하는 모든 로직을에있는 onStartCommand로 이동하십시오. 처음으로 서비스가 실행되면 을 작성하고을 호출하기 때문에 이후 onStartCommand이 호출 될 때마다 (서비스 수명까지) startService을 실행합니다.

연중 무휴로 실행하려면 전화를 다시 시작한 후 부트 브로드 캐스트를 처리하여 서비스를 시작하십시오.

권한 :

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

브로드 캐스트 :

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

당신이 앱 연중 무휴를 실행 앱)합니다 (에서 onCreate에서 알림 표시 줄에 일부 아이콘을 넣어하려는 경우 . 운영 체제는 장치의 알림 표시 줄에있는 경우이를 항상 우선 순위 프로세스로 간주하여 장치를 종료하지 않습니다. 앱 표시 아이콘을 알림 표시 줄에 넣기 위해 부팅 완료를들을 수 있습니다.

start an application from notification bar in android

0

나는 그것의 너무 늦게 알아 :하지만이는 연락처 데이터베이스의 변경을 듣고 지금과 정답 : 접촉 테이블의 변경 사항을 듣고

사용 Content Observer .

관련 문제