嘿,我正在尝试在我的

Android应用程序上实现一项服务.服务必须执行活动的相同任务. IE,如果在CallLog.Calls内容提供程序上发生某些更改,则必须通知服务并将数据插入数据库,即使应用程序未运行,我的意思是,服务将在应用程序启动后运行,因此如果应用程序被杀死,服务将继续运行,直到操作系统停止它,对吧?

因此它将在后台运行,收集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;

@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));

}

}

android服务无法启动,Android应用程序无法启动服务相关推荐

  1. 计算机启动显示安装程序正在启动服务,安装程序正在启动服务需要多久

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 安装程序正在启动服务需要多久,这个主要看软件大小,安装完成就会自动运行的,要是系统不断的提示,这个就不一定了,时间可能会很久的,需 ...

  2. 【linux】使用systemctl start xxx启动自己的程序|开机启动|守护进程

    目录 即看即用 详细说明 systemctl 的用途 用法 例子:以管理我们的程序verdaccio为例 开机启动 设置程序开机启动.关闭.启用/禁用服务以vsftpd为例 三个部分[Unit].[S ...

  3. 服务助手NSSM——将Windows程序封装成服务

    文章目录 简介 安装 初试 删除服务 详细用法 服务依赖 进程优先级 关闭服务 退出和重启 I/O 文件轮换 环境变量 事件钩子 参考文献 简介 NSSM 可以将 Windows 程序封装成服务,当服 ...

  4. 计算机提示应用程序无法启动,提示应用程序无法启动是什么原因?修复sxstrace.exe启动的方法...

    很多小伙伴在使用电脑的时候,系统提示:应用程序无法启动,因为应用程序的并行配置不正确.这个是什么情况呢?可能是Windows Modules Installer服务被禁用或者是系统缺少Microsof ...

  5. 微服务架构设计模式~为应用程序定义微服务架构

    为应用程序定义微服务架构 第一步:定义系统操作 第二步:定义服务 第三步:定义服务API和协作方式 第一步:定义系统操作 第二步:定义服务 第三步:定义服务API和协作方式

  6. android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]

    1 章节目录 2 Android Activity综述 2.1 Activity怎么用 2.2 layout - 界面布局 2.3 Java - 控制界面 2.4 AndroidManifest.xm ...

  7. Oracle单机报监听不支持服务,(转)oracle 启动监听 报“监听程序不支持服务” 解决...

    转自 http://www.51testing.com/html/99/478599-842622.html 今天安装了oracle后,启动监听,报错如下: 启动tnslsnr: 请稍候... TNS ...

  8. android校园通代码,Android校园通软件的设计与实现.doc

    4 Android校园通软件的设计与实现 4.1 研究目标 (1)了解Android应用程序的设计和开发过程: (2) 使用多种组件进行Android 平台校园资讯软件的开发. 本软件是基于Eclip ...

  9. 将Java应用程序作为Windows服务安装

    这听起来像是您不需要的东西,但是有时候,当您分发最终用户软件时,可能需要将Java程序安装为Windows服务. 我之所以必须这样做,是因为我开发了一种用于公务员的工具 ,可以自动将其Excel文件转 ...

  10. 法那科机器人初始化启动_FANUC机器人程序自动启动介绍

    <FANUC机器人程序自动启动介绍>由会员分享,可在线阅读,更多相关<FANUC机器人程序自动启动介绍(20页珍藏版)>请在人人文库网上搜索. 1.程序启动条件及时序介绍,上海 ...

最新文章

  1. C++ pair的使用
  2. SVM 实现与代码(转)
  3. 对mysql的各种sql语句如何对表加锁的实验
  4. java圆形进度条_可拖拽圆形进度条组件(支持移动端)
  5. Problem J: Island Buses
  6. 判定是否过拟合、欠拟合的一种方式
  7. ArrayListd的长度问题
  8. 利用MFC向导生成单文档应用程序框架
  9. Modelbuilder进阶教程
  10. 求任意多边形面积(凹多边形和凸多边形)
  11. C语言运算符优先级表详解
  12. 人类最美的24张数学画(图)
  13. html黑洞效果,html5黑洞动画特效
  14. DSP28377 I2C开发笔记
  15. vue + Electron 制作桌面应用
  16. error: dst ref refs/heads/dev receives from more than one src.
  17. 微机原理与接口技术的基础知识
  18. window11 定时关机脚本
  19. Python发送邮件的类
  20. 服务器插在显示屏上不亮,主机正常运行,但显示屏不亮,我将教您如何自行解决!...

热门文章

  1. 眼界 思维 意识 习惯
  2. 小组项目具体分工情况(Web.ui相关)
  3. Vulnhub_gigachad_vh
  4. 双机热备(双主模式)——实现数据库的高可用
  5. 首款搭载Tango技术的AR手机Phab2 Pro将在下月开售
  6. 千克 磅 磅 千克 的转换
  7. cursor 鼠标样式的几种样式
  8. DevStack环境搭建
  9. 一张图解析FastAdmin中的FormBuilder表单生成器
  10. matlab分数约分,分母