我正在开发一个具有倒数计时器的应用程序。我想只有在手机上有来电时暂停该计时器。每当我们接到电话时,有没有办法解雇一个事件?
答案 0 :(得分:4)
我认为你应该扩展PhoneStateListener
类。在那个类中你处理电话状态。为此,使用清单文件中的权限来处理电话状态(即<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
)。
并使用TelephonyManager
获取手机的状态。
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
manager.listen(this, LISTEN_CALL_STATE); // Registers a listener object to receive notification of changes in specified telephony states.
并覆盖此方法。
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK:
case TelephonyManager.CALL_STATE_RINGING:
// Here you can perform your task while phone is ringing.
break;
case TelephonyManager.CALL_STATE_IDLE:
break;
}
}
答案 1 :(得分:1)
当收到电话呼叫时,OS会触发一条消息,技术上称为广播。
任何应用程序都可以通过注册PhoneIntentReceiver来查看/回复此消息, 如果安装了多个已安装的应用程序,则所有应用程序都有机会根据优先级查看此消息。
您可以通过Manifest或Programatically注册PhoneIntentReceiver。在这两种情况下,您都指定了一个扩展项目中广播接收器的类,它将在检测到来电时收到回调。
然后在这个类中,控件被传递给onReceive方法。它在这里你可以阻止你的Timmer。
这就是它背后的故事。快乐的编码。
答案 2 :(得分:0)
您必须编写侦听来电的广播接收器
请参阅this链接了解详情...
答案 3 :(得分:0)
你必须使用广播接收器........
首先在manifest.xml中注册您的接收器
<receiver android:name="com.cygnet.phonefinder.receiver.PhoneIntentReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
然后你必须在
中处理这个接收者public class PhoneIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) { } }
答案 4 :(得分:0)
我想说最好的实现方法是利用时间戳,计时器(java.util.Timer或android.app.AlarmManager),然后使用广播接收器监听电话事件。
基本上每次需要在一段时间内启动警报时,都会存储该警报开始的时间戳(可能是sql db中最简单的),然后启动计时器/警报。当闹钟响起时,请务必清理存储的时间戳。
确保收听电话状态更改并通过电话接听更改清除所有闹钟/计时器并记录停止日期以及之前的时间戳,然后在电话呼叫结束时(从您的接收方事件)重新启动计时器/剩余时间的警报。
答案 5 :(得分:0)
在您的Broadcastreceiver onReceive()
中编写以下代码
不要忘记给予适当的许可
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
MyCallStateListener customPhoneListener = new MyCallStateListener();
telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
if (!intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
return;
public class MyCallStateListener extends PhoneStateListener {
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
}
}
}
答案 6 :(得分:-5)
public class OutgoingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "My Toast", Toast.LENGTH_LONG).show();
}
}
尝试使用此接收器触发事件