gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:48 25 4
gpt4 key购买 nike

我有一个应用程序,在用户通过 OAuth 对 webview Activity 进行身份验证后生成音乐,看起来像这样:主要播放器 Activity -OAuth Activity -返回到主要播放器 Activity 。但是,从 OAuth Activity 开始时会调用两次 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 Activity 的代码

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();
}

关于从另一个 Activity 导航回来时,Android Activity onCreate 被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18199724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com