gpt4 book ai didi

Android 应用程序不启动服务

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:37 26 4
gpt4 key购买 nike

嘿,我正在尝试在我的 Android 应用程序上实现一项服务。 Service 必须执行与 Activity 相同的任务。 IE,如果 CallLog.Calls 内容提供者发生一些变化,即使应用程序没有运行,也必须通知服务并将数据插入数据库,我的意思是,应用程序启动后服务将运行,所以如果应用程序被杀死,服务将继续运行,直到操作系统停止它,对吧?

因此它将在后台运行,收集 CallLog.Calls 服务上发生变化的所有数据。但是,该服务没有运行。我在 Activity 的 onCreate() 方法中加注星标。在服务内部,我实现了一个 ContentObserver 类,该类使用 onChange() 方法,以防 CallLog.Calls 内容提供程序发生某些变化。

我不知道的是为什么服务没有启动,以及为什么即使我从 DDMS 角度杀死应用程序它也不起作用。

这是代码。

名为 RatedCalls.java 的 Activity

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;

@Override
public 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, null, 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, null, null, null,
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, null, 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();

}
}

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate() {

Toast.makeText(this, "Rated Calls Service Created", Toast.LENGTH_LONG).show();
Log.i(TAG, "onCreate");
registerContentObservers();

}

@Override
public void onDestroy() {

Toast.makeText(this, "Rated Calls Service Stopped", Toast.LENGTH_LONG).show();
Log.i(TAG, "onDestroy");
cdh = new CallDataHelper(this);
db = openHelper.getWritableDatabase();

}

@Override
public 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, null, null, null,
android.provider.CallLog.Calls.DATE + " DESC ");

Log.i("FILLLIST", "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", 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, null, values);

} while (cursor.moveToNext());
cursor.close();
}
}


public void registerContentObservers() {

this.getApplicationContext()
.getContentResolver()
.registerContentObserver(
android.provider.CallLog.Calls.CONTENT_URI, true,
new RatedCallsContentObserver(handler));

}

}

最佳答案

只要看看你是否在你的 list 文件中添加了这个服务......

谢谢......

关于Android 应用程序不启动服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4520850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com