0

我编写了一个带有 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 方法都没有被调用,我没有收到任何错误或警告。

所以我有两个问题:

  1. 服务是解决我的问题的正确方法,还是存在更好的解决方案
  2. 如果服务是正确的解决方案,为什么它没有启动?

编辑:奇怪的是带有广播接收器的解决方案总是在模拟器上工作(即使我的应用程序关闭)。仅当我接到真实手机的电话时才会出现此问题。

4

1 回答 1

1

执行以下操作,

1) 注册一个 PhoneStateChange 接收器。广播接收器教程

2)检查是否是未接来电。

3) 如果是未接来电,则启动一个 intentService 以显示通知。intentService 教程

编辑:-在 Manifest 中注册 Receiver,以便即使未打开应用程序也可以工作。

1)创建一个独立的类(无内部类)用广播接收器扩展它。详细看这里

2)您需要在AndroidManifest文件中添加Receiver。像下面

    <receiver android:name="MyPhoneReceiver" > // this is name of your receiver class
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" >
                </action>
            </intent-filter>
        </receiver>

3)取得适当的许可,一个是

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

即使您的应用程序关闭,它也能正常工作

于 2013-09-11T09:44:00.580 回答