我编写了一个带有 BroadcastReceiver(用于电话状态)的联系人列表应用程序,它在 WindowManager 的帮助下通知用户每个未接来电(类似于“any.do”等应用程序中的提醒)。问题是,这仅在我的应用程序正在运行时才有效,一旦我关闭它,此通知似乎已被禁用。但是当应用程序未处于活动状态时,用户也应该获得关于每个未接电话的明确消息(包括有关处理此未接电话的特殊功能)。
这是我的接收器
public class CallReceiver extends BroadcastReceiver {
private static String lastState = TelephonyManager.EXTRA_STATE_IDLE;
@Override
public void onReceive(final Context context, Intent intent) {
这是AndroidManifest的一部分
<receiver android:name="addressbook.CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
我的下一步是编写一个服务来完成这项工作,并检查这是否符合我的要求。这个想法不是使用广播接收器,而是在服务中注册一个 contentObserver,它检查呼叫日志中是否存在新的未接来电。我试图遵循我在这个论坛上找到的关于服务的所有建议,但我无法启动该服务。
这是 AndroidManifest 中的部分
<service
android:name="addressbook.ContentObserverService"
android:enabled="true"/>
这是我尝试在 AddressBook.java 中启动该服务的地方
startService(new Intent(getApplicationContext(), ContentObserverService.class));
public class ContentObserverService extends Service {
private Observer observer;
public void onCreate() {
super.onCreate();
D.d("observer created");
Handler handler = new Handler();
observer = new Observer(handler);
getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, observer);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
D.d("onStartCommand");
super.onStartCommand(intent, flags, startId);
return Service.START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(observer);
}
但是 onCreate 和 onStartCommand 方法都没有被调用,我没有收到任何错误或警告。
所以我有两个问题:
- 服务是解决我的问题的正确方法,还是存在更好的解决方案
- 如果服务是正确的解决方案,为什么它没有启动?
编辑:奇怪的是带有广播接收器的解决方案总是在模拟器上工作(即使我的应用程序关闭)。仅当我接到真实手机的电话时才会出现此问题。