android服务类中的PhoneListener

android服务类中的PhoneListener,android,service,Android,Service,我正在开发一个android应用程序,其中我使用服务类作为电话侦听器 在通话结束后,我需要让用户回到我的应用程序 它工作得非常好,但当我的应用程序没有关闭,我尝试从Android手机的默认拨号器呼叫时,在呼叫结束时,它会返回到我的应用程序(这不是必需的) 我怎样才能解决这个问题 这是我正在使用的服务类 PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override

我正在开发一个android应用程序,其中我使用服务类作为电话侦听器

在通话结束后,我需要让用户回到我的应用程序

它工作得非常好,但当我的应用程序没有关闭,我尝试从Android手机的默认拨号器呼叫时,在呼叫结束时,它会返回到我的应用程序(这不是必需的)

我怎样才能解决这个问题

这是我正在使用的服务类

PhoneStateListener phoneStateListener = new PhoneStateListener() 
    {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) 
        {
            super.onCallStateChanged(state, incomingNumber);

            if (state == TelephonyManager.CALL_STATE_RINGING)
            {
            } 
            else if(state == TelephonyManager.CALL_STATE_IDLE)
            {
                if(end.equalsIgnoreCase("YES"))
                {
                    Log.e("Service","end of cal - CAL IDLE ");
                    Intent i = new Intent(ServiceforPhone.this, PhoneCall.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(i);
                    end = "NO";
                    StopServ();
                }
            } 
            else if(state == TelephonyManager.CALL_STATE_OFFHOOK)
            {
                end = "YES";
                Log.e("Service"," of HOOK ");
            }
        }
    };

    TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    if(mgr != null)
    {
        mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
    } 

嗯。。。我认为在这种情况下你需要更复杂的逻辑。尝试在通话结束时分析当前活动-如果它们包含您的活动,则您应该跳过返回,否则请立即返回应用程序

下面是代码示例,可以在运行中找到您的活动:

PhoneStateListener phoneStateListener = new PhoneStateListener() 
    {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) 
        {
            super.onCallStateChanged(state, incomingNumber);

            if (state == TelephonyManager.CALL_STATE_RINGING)
            {
            } 
            else if(state == TelephonyManager.CALL_STATE_IDLE)
            {
                if(end.equalsIgnoreCase("YES"))
                {
                    Log.e("Service","end of cal - CAL IDLE ");

                    ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
                    List<RunningTaskInfo> tasks = am.getRunningTasks(100);
                    for (RunningTaskInfo runningTaskInfo : tasks) {
                        String packageName = runningTaskInfo.topActivity.getPackageName();
                        if packageName.equals(YOUR_ACTIVITY_PACKAGE)
                            // found our activity, exit
                            return;
                    }

                    // activity not founded, start
                    Intent i = new Intent(ServiceforPhone.this, PhoneCall.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(i);
                    end = "NO";
                    StopServ();
                }
            } 
            else if(state == TelephonyManager.CALL_STATE_OFFHOOK)
            {
                end = "YES";
                Log.e("Service"," of HOOK ");
            }
        }
    };
PhoneStateListener PhoneStateListener=new PhoneStateListener()
{
@凌驾
public void onCallStateChanged(int状态,字符串incomingNumber)
{
super.onCallStateChanged(状态、收入编号);
if(state==TelephonyManager.CALL_state_RINGING)
{
} 
else if(state==TelephonyManager.CALL\u state\u IDLE)
{
如果(结束同等信号情况(“是”))
{
Log.e(“服务”,“校准结束-校准空闲”);
ActivityManager am=(ActivityManager)getSystemService(ACTIVITY_服务);
列表任务=am.getRunningTasks(100);
用于(RunningTaskInfo RunningTaskInfo:tasks){
字符串packageName=runningTaskInfo.topActivity.getPackageName();
如果packageName.equals(您的活动包)
//找到我们的活动,退出
返回;
}
//未建立活动,请启动
意图i=新意图(ServiceforPhone.this、PhoneCall.class);
i、 addFlags(意图、标志、活动、新任务);
星触觉(i);
end=“否”;
StopServ();
}
} 
else if(state==TelephonyManager.CALL_state_OFFHOOK)
{
end=“是”;
Log.e(“服务”、“吊钩”);
}
}
};
还请注意,此代码需要权限:

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