如何在后台24X7中运行我的应用程序来监听联系人数据库中的更改

时间:2012-03-31 11:45:51

标签: android

我已经编写了一个包含服务类和活动的应用程序。

我从像这样的活动开始服务

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;
            }

    }
}

当我运行此应用并修改联系人时,它首次显示通知 如果我在几秒钟内再次进行修改,那就不行了,为什么请任何人帮助我

4 个答案:

答案 0 :(得分:2)

因为onCreate方法通常被调用一次。

实际上,无法保证您的应用会全天候工作,因为如果内存不足,操作系统可能会将其杀死。当然,如果您的服务“粘性”,它将被重新创建(因此,它几乎是24x7)。

答案 1 :(得分:2)

将所有逻辑移至 onStartCommand ,每次进行更改时都要将其发生。因为第一次执行服务后会调用 onCreate ,之后每次都会调用 onStartCommand (直到服务的生命周期),执行 startService

为了让它更灵活地全天候运行,请确保在重新启动手机后通过处理 Boot 广播来启动服务。

许可:

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

广播:

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

答案 2 :(得分:0)

如果您想全天候运行应用,请在应用的onCreate()的通知栏中放置一些图标。如果OS位于设备的通知栏中并且不会将其终止,则OS会将其作为优先级进程。您可以听取启动完成,将您的应用图标放在通知栏中。

start an application from notification bar in android

答案 3 :(得分:0)

我知道为时已晚:但是现在听到联系人数据库中的更改是正确的答案:

  

使用Content Observer收听联系人表格中的任何更改。