因此它将在后台运行,收集CallLog.Calls服务上更改的所有数据.但是,该服务没有运行.我在Activity的onCreate()方法中加注它.在Service中,我实现了一个ContentObserver类,它使用onChange()方法,以防CallLog.Calls内容提供程序中的某些更改.
我不知道的是为什么服务没有启动,以及为什么即使我在DDMS视角杀死应用程序它也不起作用.
这是代码.
该Activity名为RatedCalls.java
public class RatedCalls extends ListActivity {private static final String LOG_TAG = "RATEDCALLSOBSERVER";private Handler handler = new Handler();private sqliteDatabase db;private CallDataHelper cdh;StringBuilder sb = new StringBuilder();OpenHelper openHelper = new OpenHelper(RatedCalls.this);private Integer contentProvIDerLastSize;private Integer contentProvIDerCurrentSize;@OverrIDepublic voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); cdh = new CallDataHelper(this); db = openHelper.getWritableDatabase(); startService(new Intent(this,RatedCallsService.class)); registerContentObservers(); Log.i("FILLList","calling from onCreate()"); Cursor cursor = getContentResolver().query( androID.provIDer.CallLog.Calls.CONTENT_URI,null,androID.provIDer.CallLog.Calls.DATE + " DESC "); contentProvIDerLastSize = cursor.getCount();}class RatedCallsContentObserver extends ContentObserver { public RatedCallsContentObserver(Handler h) { super(h); } @OverrIDe public boolean deliverSelfNotifications() { return true; } @OverrIDe public voID onChange(boolean selfChange) { Log.d(LOG_TAG,"RatedCallsContentObserver.onChange( " + selfChange + ")"); super.onChange(selfChange); searchInsert(); }}private voID searchInsert() { Cursor cursor = getContentResolver().query( androID.provIDer.CallLog.Calls.CONTENT_URI,androID.provIDer.CallLog.Calls.DATE + " DESC "); Log.i("FILLList","Calling from searchInsert"); startManagingCursor(cursor); int numberColumnID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.NUMBER); int durationID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.DURATION); int contactnameID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.CACHED_name); int numTypeID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.CACHED_NUMBER_TYPE); Date dt = new Date(); int hours = dt.getHours(); int minutes = dt.getMinutes(); int seconds = dt.getSeconds(); String currTime = hours + ":" + minutes + ":" + seconds; SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy"); Date date = new Date(); cursor.movetoFirst(); String contactNumber = cursor.getString(numberColumnID); String contactname = cursor.getString(contactnameID); String duration = cursor.getString(durationID); String numType = cursor.getString(numTypeID); stopManagingCursor(cursor); ContentValues values = new ContentValues(); values.put("contact_ID",1); values.put("contact_name",contactname); values.put("number_type",numType); values.put("contact_number",contactNumber); values.put("duration",duration); values.put("date",dateFormat.format(date)); values.put("current_time",currTime); values.put("cont",1); db.insert(CallDataHelper.table_name,values); } public voID registerContentObservers() { this.getApplicationContext() .getContentResolver() .registerContentObserver( androID.provIDer.CallLog.Calls.CONTENT_URI,true,new RatedCallsContentObserver(handler));}
这就是名为RatedCallsService.java的服务
public class RatedCallsService extends Service {private static final String TAG = "RatedCallsService";private static final String LOG_TAG = "RatedCallsService";private Handler handler = new Handler();private sqliteDatabase db;private CallDataHelper cdh;OpenHelper openHelper = new OpenHelper(RatedCallsService.this);class RatedCallsContentObserver extends ContentObserver { public RatedCallsContentObserver(Handler h) { super(h); } @OverrIDe public boolean deliverSelfNotifications() { return true; } @OverrIDe public voID onChange(boolean selfChange) { Log.d(LOG_TAG,"RatedCallsContentObserver.onChange( " + selfChange + ")"); super.onChange(selfChange); searchInsert(); }}@OverrIDepublic IBinder onBind(Intent arg0) { // Todo auto-generated method stub return null;}@OverrIDepublic voID onCreate() { Toast.makeText(this,"Rated Calls Service Created",Toast.LENGTH_LONG).show(); Log.i(TAG,"onCreate"); registerContentObservers();}@OverrIDepublic voID onDestroy() { Toast.makeText(this,"Rated Calls Service Stopped","onDestroy"); cdh = new CallDataHelper(this); db = openHelper.getWritableDatabase();}@OverrIDepublic voID onStart(Intent intent,int startID) { Toast.makeText(this,"Rated Calls Service Started",Toast.LENGTH_LONG).show(); Log.d(TAG,"onStart"); registerContentObservers();}private voID searchInsert() { Cursor cursor = getContentResolver().query( androID.provIDer.CallLog.Calls.CONTENT_URI,"Calling from searchInsert"); int numberColumnID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.NUMBER); int durationID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.DURATION); int contactnameID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.CACHED_name); int numTypeID = cursor .getColumnIndex(androID.provIDer.CallLog.Calls.CACHED_NUMBER_TYPE); Date dt = new Date(); int hours = dt.getHours(); int minutes = dt.getMinutes(); int seconds = dt.getSeconds(); String currTime = hours + ":" + minutes + ":" + seconds; SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy"); Date date = new Date(); if (cursor.movetoFirst()) { do { String contactNumber = cursor.getString(numberColumnID); String contactname = cursor.getString(contactnameID); String duration = cursor.getString(durationID); String numType = cursor.getString(numTypeID); ContentValues values = new ContentValues(); values.put("contact_ID",values); } while (cursor.movetoNext()); cursor.close(); }}public voID registerContentObservers() { this.getApplicationContext() .getContentResolver() .registerContentObserver( androID.provIDer.CallLog.Calls.CONTENT_URI,new RatedCallsContentObserver(handler));} }解决方法 只需看看你是否在清单文件中添加了此服务…….
谢谢…….
总结以上是内存溢出为你收集整理的Android应用程序无法启动服务全部内容,希望文章能够帮你解决Android应用程序无法启动服务所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)