我已经编写了一个包含服务类和活动的应用程序。
我从像这样的活动开始服务
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;
}
}
}
当我运行此应用并修改联系人时,它首次显示通知 如果我在几秒钟内再次进行修改,那就不行了,为什么请任何人帮助我
答案 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会将其作为优先级进程。您可以听取启动完成,将您的应用图标放在通知栏中。
答案 3 :(得分:0)
我知道为时已晚:但是现在听到联系人数据库中的更改是正确的答案:
使用Content Observer收听联系人表格中的任何更改。