【问题标题】:how to keep application running in background when phone rings on android当手机在android上响起时如何让应用程序在后台运行
【发布时间】:2014-05-23 05:52:27
【问题描述】:

目前,当我运行我的应用程序时,如果电话响起,电话会获得偏好并且我的应用程序会被终止。我的应用程序是否有任何偏好,即让电话打语音邮件或将我的应用程序在短时间内转移到后台,直到用户接听电话,并在完成后返回前台。谢谢

【问题讨论】:

  • +1 它也停止了我的 gps
  • 电话状态列表,收到后,在 pause() 上调用您的活动或执行任何您需要的操作
  • saqib - 你能解释一下这种方法吗
  • android developer documentation 非常详细地解释了这个过程。如需更多信息,请阅读Activity 文档。

标签: android process background


【解决方案1】:

你可以做一件事。您可以在来电期间暂停应用程序,然后从同一位置恢复应用程序。我知道这不是您问题的确切解决方案,但不知何故,它会减少您的工作量。希望这会有所帮助。

private class PhoneCallListener extends PhoneStateListener {

        private boolean isPhoneCalling = false;

        // needed for logging
        String TAG = "PhoneCallListener";

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {

            if (TelephonyManager.CALL_STATE_RINGING == state) {
                // phone ringing
                Log.i(TAG, "RINGING, number: " + incomingNumber);
            }

            if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
                // active
                Log.i(TAG, "OFFHOOK");

                isPhoneCalling = true;
            }

            if (TelephonyManager.CALL_STATE_IDLE == state) {
                // run when class initial and phone call ended,
                // need detect flag from CALL_STATE_OFFHOOK
                Log.i(TAG, "IDLE");

                if (isPhoneCalling) {

                    Log.i(TAG, "restart app");

                    // restart call application
                    Intent i = getBaseContext().getPackageManager()
                            .getLaunchIntentForPackage(
                                    getBaseContext().getPackageName());
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                            | Intent.FLAG_ACTIVITY_CLEAR_TOP
                            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    startActivity(i);

                    isPhoneCalling = false;
                }

            }


    }
    }

并将此权限添加到 manifest.xml 文件中

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

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,通过覆盖 onPause() 和 onResume() 方法解决了这个问题,将所有必需的变量保存在 onPause() 中并在 onResume() 中恢复这些变量。

    @Override
    protected void onResume(){
        super.onResume();
        load();
    }
    
    @Override
    protected void onPause(){
        super.onPause();
        save();
    }
    
    private void save() {
        SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("DeviceName", deviceName);
        editor.putString("ConnectOption", connectOption.toString());
        editor.commit();
    }
    
    private void load() { 
        SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
        deviceName = sharedPreferences.getString("DeviceName","");
        String connectop = sharedPreferences.getString("ConnectOption","USB"); //You could provide a default value here
    

    }

    【讨论】:

      【解决方案3】:

      我认为这是任何应用程序都默认的 android 功能 如果来电处于活动状态,则变为非活动状态。我们无法改变这一点。

      但是,当用户正在通话时,他们可以切换到另一个 只需按下主页按钮并启动另一个应用程序 主屏幕,或双击主屏幕按钮并切换到另一个应用程序,包括您的应用程序。

      【讨论】:

      • 我的应用程序正在计算多个数字。当您使应用程序处于非活动状态时,所有会话特定变量都会重新初始化,因此数据会丢失。任何想法。
      猜你喜欢
      • 2017-05-26
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多