从另一个 Activity 导航回来时,Android Activity onCreate 被调用两次

2023-11-26

我有一个应用程序,可以在用户在 webview 活动上使用 OAuth 进行身份验证后生成音乐,看起来像这样:主要播放器活动 - OAuth 活动 - 返回主要播放器活动。但是,当从 OAuth 活动中调用 onCreate 方法时,会调用两次,导致同时生成和播放两个音轨。 这是 MainActivity 的部分代码:

public class MainActivity extends Activity {
int pitch=60;
private static final float VISUALIZER_HEIGHT_DIP = 50f;
Random rn;

boolean isRunning = true;  
boolean isPlaying=false;
SeekBar fSlider;
double sliderval;
MediaPlayer mediaPlayer=new MediaPlayer();
ImageButton startStopButton;
ImageButton stopButton;
SeekBar vSlider;
VisualizerView mVisualizerView;
private Visualizer mVisualizer;
ImageButton connectButton;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   // point the slider to the GUI widget
    rn = new Random();
    fSlider = (SeekBar) findViewById(R.id.frequency);        
    fSlider.setProgress(0);
    vSlider= (SeekBar) findViewById(R.id.seekBar2);
    vSlider.setMax(10);
    vSlider.setProgress(0);
    TextView viewinterval=(TextView) findViewById(R.id.textView2);     
    viewinterval.setText("");
    startStopButton=(ImageButton) findViewById(R.id.imageButton2);
    View activity= this.findViewById(R.id.playerActivity); 
    stopButton=(ImageButton) findViewById(R.id.imageButton1);
    RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, (int)(VISUALIZER_HEIGHT_DIP * getResources().getDisplayMetrics().density));
    params.addRule(RelativeLayout.BELOW, R.id.seekBar2);
    mVisualizerView = new VisualizerView(this);
    mVisualizerView.setLayoutParams(params);
    ((ViewGroup) activity).addView(mVisualizerView);
    connectButton=(ImageButton) findViewById(R.id.imageButton3);
    connectButton.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View arg0) {
            mediaPlayer.pause();
            Intent intent= new Intent(getApplicationContext(), WebViewActivity.class);
            startActivity(intent);
        }           
    });
    if(riskscores.length !=0){
        viewinterval.setText("generating audio");
        new MIDISequence().execute();           
    }
   };

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}


@Override
protected void onPause() {
    super.onPause();
    if(mediaPlayer.isPlaying()){
        mediaPlayer.pause();
    }
}

class MIDISequence extends AsyncTask<String,Void,String>{

这是我的 OAuth 活动中的代码

public class WebViewActivity extends Activity {
private WebView gWebView;
final String REDIRECT_URI = "https://localhost:5000/receive_code";
final String CLIENT_ID = "can't post it here";
final String CLIENT_SECRET = "can't post it here";
final String SCOPE = "basic names genomes analyses";

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webview);

    gWebView = (WebView) findViewById(R.id.webView1);

    gWebView.loadUrl("https://api.23andme.com/authorize/?redirect_uri="
            + REDIRECT_URI + "&response_type=code&client_id=" + CLIENT_ID
            + "&scope=" + SCOPE);

    Log.d("WEBVIEW", "got to webpage");

    gWebView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (url.startsWith(REDIRECT_URI)) {
                Log.d("WEBVIEW", "onpagefinished is called");
                System.out.println("got to override");
                if (url.indexOf("code=") != -1) {
                    //if the query contains code
                    String queryString = null;
                    try {
                        queryString = new URL(url).getQuery();
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(queryString);
                    String[] params = queryString.split("&");
                    String code = null;
                    for (String param : params) {
                        if (param.startsWith("code=")) {
                            code = param.substring(param.indexOf('=') + 1);
                        }
                    }
                    gWebView.setVisibility(View.GONE);
                    new PostRequest().execute(code);
                    // don't go to redirectUri
                }
            }
        }
    });


}
class PostRequest extends AsyncTask<String,Void,String>{


    @Override
    protected String doInBackground(String... params) {
               code retrieving client data.....


            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                System.out.println("CPE" + e);
            } catch(SocketException ex)
               {
                 Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
                   ex.printStackTrace();
                   return "error occured";
               } catch (JSONException e) {
                e.printStackTrace();
                return "error occured";
            } catch (IllegalStateException e) {
                e.printStackTrace();
                return "error occured";
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return "error occured";
            }
        }
        return "request complete";
    }

    @Override
    protected void onPostExecute(String result) {       
        super.onPostExecute(result);
        Log.d("Post result", result);
        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
        startActivity(intent);
    }

}

} 由于某种原因,MainActivity 的 onCreate 方法被调用了两次......这是怎么回事?


您的实施中似乎存在错误。问题是,您正在尝试使用 Intent 对象导航回 MainActivity 表单 WebActvitity。这是个问题。你不应该这样做。

每当您想返回到上一个 Activity 时,您只需在当前 Activity 中调用 finish() 即可。

在我们的场景中,通过在 WebActivity 中使用 Intent,您可以为 MainActivity 创建一个新实例,该实例已存在于堆栈(后台)中。只需在 WebActivity 中调用 finish() 即可将其关闭,并且您的 MainActivity 应该可见。

进行以下更改,

@Override
protected void onPostExecute(String result) {       
    super.onPostExecute(result);
    Log.d("Post result", result);
    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    startActivity(intent);
}

像这样替换上面的方法,

@Override
protected void onPostExecute(String result) {       
    super.onPostExecute(result);
    Log.d("Post result", result);
    finish();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从另一个 Activity 导航回来时,Android Activity onCreate 被调用两次 的相关文章

随机推荐

  • 将模块写入 .bc 位码文件

    我假设从模块转储 bc 文件是一个微不足道的操作 但现在 第一次我必须真正从代码中做到这一点 为了我的一生 我 在这个过程中找不到一个缺失的步骤 static void WriteModule const Module M Bitstrea
  • 资源不在java项目的构建路径上?

    我的 Eclipse 上有一个 Maven 项目 当我执行调用层次结构时 我收到消息 该资源不在 java 项目的构建路径上 为此需要配置什么 我按照以下步骤操作 它起作用了 属性 gt 项目方面 gt 检查java gt 确定 转换为ma
  • 在 O(n) 和常数空间中查找重复[重复]

    这个问题在这里已经有答案了 可能的重复 简单的面试问题变得更难 给定数字 1 100 找到缺失的数字 在线性时间和常量空间中查找数组中缺失和重复的元素 我在一个论坛上看到一个有趣的问题 你有从 1 到 100 的 100 个元素 但由于错误
  • 使用 tweepy 流式传输用户的时间线和过滤的推文

    几天前我开始探索 tweepy 并且能够实时流式传输经过过滤 带有关键字 的推文 现在我不仅想流式传输经过过滤的推文 还想流式传输来自多个特定 Twitter 用户的推文 使用 tweepy 可以吗 看来stream userstream
  • 所以在java中你不能有具有不同返回值和参数的重复方法名称?

    Java中是否可以有两个名称相同但参数和返回类型不同的方法 看起来这将是概括一个简单的 getter 和 setter 的好方法 您可以使用构造函数来做到这一点 为什么不使用常规方法呢 例如 为什么不能做 int getVal return
  • 将 Sencha Cmd 与动态加载的控制器结合使用

    我使用 Ext JS 4 创建了一个应用程序 controllers我的财产app js仅包含主控制器 Ext application name MyApp appFolder app controllers main App loadCo
  • 使用 Selenium WebDriver 和 python 按下 ENTER 键[重复]

    这个问题在这里已经有答案了 如何使用 selenium python 绑定模拟 ENTER 按键 我已经尝试过以下块 但它不起作用 driver find element by xpath html xxxxx send keys keys
  • 如何从 sklearn 反转标签编码器以获取多列?

    我想在多列上使用 LabelEncoder 的 inverse transform 函数 这是我在数据帧上应用 LabelEncoder 时用于多个列的代码 class MultiColumnLabelEncoder def init se
  • matplotlib 3d 表面上的连续阴影

    在 matplotlib 3D 图中 我可以设置行 列数来确定表面上可见的面总数 s ax plot surface x y z color gray shade True rstride 1 cstride 1 其中 rstride 和
  • 使用 ORDER BY 子句的替代结果

    CREATE TABLE TEST customername varchar 50 INSERT INTO TEST VALUES CUSTOMER 1 INSERT INTO TEST VALUES CUSTOMER 1 INSERT I
  • 如何在 jsoup 中获取元素的第一级子元素

    在jsoup中Element children 返回 Element 的所有子元素 后代 但是 我想要元素的第一级子级 直接子级 我可以使用哪种方法 Element children 仅返回直接子元素 既然你把他们绑在树上 他们也会有孩子
  • 如何创建接受不超过 10 位数字的正则表达式?

    如何创建接受不超过 10 位数字的正则表达式 thanks 既然你问了 如何 我将尝试逐步解释 因为您没有指定您正在使用哪种正则表达式风格 所以我将在PCRE and 两个 POSIX 正则表达式变体 For simple在这种情况下 您应
  • 使用 iPhone 音频适配器传输数据

    我刚刚开始在一家生物医学公司工作 我们需要将我们正在制造的设备中的数据传输到 iPhone 显然 使用 iPhone 程序就足够了 但对于原型设计和更简单的解决方案 我想知道我们是否可以使用现有的蓝牙音频发射器 例如 http www bu
  • python高效子字符串搜索[重复]

    这个问题在这里已经有答案了 可能的重复 string find 在 CPython 中是如何实现的 我在堆栈溢出中阅读了许多文章 比较了子字符串搜索的性能 例如Python字符串搜索效率 这是搜索子字符串最有效的方法吗 python 中的子
  • RecyclerView:如何创建插入动画效果?

    我有一个ReyclerView与一个LinearLayoutManager and an Adapter
  • 如何将MySQLi结果集加载到二维数组中?

    我的 mysqli 结果集有问题 我有一个包含一堆消息的表 表中的每一行代表一条消息 我有一些列 例如 ID 标题 正文和 公共 公共列包含布尔值 指定消息是向所有人显示还是仅向发布者显示 我有一个页面 我想在其中显示所有公共消息 如果您单
  • 无法将下载的文件存储在相关文件夹中

    我用 python 结合 selenium 编写了一个脚本 用于从网页下载一些文档文件 以 doc 结尾 我不想使用的原因requests or urllib下载文件的模块是因为我当前正在玩的网站没有任何真实的网址连接到每个文件 它们是 J
  • 大图像的语义分割

    我正在处理数量有限的大尺寸图像 每个图像都可以有3072 3072像素 为了使用 FCN 或 U net 训练语义分割模型 我构建了一个大样本的训练集 每个训练图像是128 128 在预测阶段 我所做的是将大图像切成小块 与训练集相同128
  • Spring:如何使用@Value注释注入内联字符串列表[重复]

    这个问题在这里已经有答案了 如何使用注入字符串值列表 Value注解 我正在使用 Spring 4 1 2 我试过了 Value value top person organizationalPerson user private List
  • 从另一个 Activity 导航回来时,Android Activity onCreate 被调用两次

    我有一个应用程序 可以在用户在 webview 活动上使用 OAuth 进行身份验证后生成音乐 看起来像这样 主要播放器活动 OAuth 活动 返回主要播放器活动 但是 当从 OAuth 活动中调用 onCreate 方法时 会调用两次 导