Android的活动的onCreate被称为两次当航海下返回从另一个活动 [英] Android Activity onCreate Being Called Twice When Navigated Back From Another Activity

查看:80
本文介绍了Android的活动的onCreate被称为两次当航海下返回从另一个活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序生成的音乐后,用户与OAuth的认证上的WebView活动,看起来像这样:主要的玩家活动,OAuth的活动,回到主玩家活动。然而,从OAuth的活动持续时,导致产生和发挥,同时两个音频轨道onCreate方法被调用两次。 下面是从MainActivity的code部分:

I have an app that generates music after a user authenticates with OAuth on a webview activity, looking something like this: main player activity-OAuth Activity-back to main player activity. However, the onCreate method is being called twice when going from the OAuth activity, resulting in two audio tracks generated and played at the same time. Here's part of the code from the 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>{

这里的code从我的OAuth活动

Here's the code from my 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方法被调用两次因某种原因...什么是怎么回事?

} The onCreate method of the MainActivity is called twice for some reason... What is going on here?

推荐答案

似乎是在实现一个错误。关键是,你要使用一个Intent对象导航回到你的MainActivity形式WebActvitity。这是一个问题。你不应该这样做。

There seems to be a mistake in your implementation. The thing is, you are trying to use an Intent object to navigate back to your MainActivity form WebActvitity. This is a problem. You shouldn't be doing that.

每当你想搬回到您的previous活动,你应该简单地调用完成()在当前的活动。

Whenever you wanna move back to your previous activity, you should simply be calling finish() in the current Activity.

在我们的情况下,通过在WebActivity使用意图要创建为您的MainActivity一个新实例,它已经存在于栈(背景)。简单地调用完成()在WebActivity应该关闭它和你的MainActivity应该是可见的。

In our scenario,the by using Intent in your WebActivity you are creating a new instance for your MainActivity which already exists in the stack(background). Simply calling finish() in the WebActivity should close it and your MainActivity should be visible.

执行以下更改,

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

替换上面的方法是这样,

Replace the above method like this,

@Override
protected void onPostExecute(String result) {       
    super.onPostExecute(result);
    Log.d("Post result", result);
    finish();
}

这篇关于Android的活动的onCreate被称为两次当航海下返回从另一个活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆