Android startActivityForResult unfortunately 程序名 has stopped的问题

文章内容:1.startactivityForResult的使用2.使用中遇到的问题3.解决方法1.Android 中启动其他Activity并返回结果,Android中提供一个startActivityForResult方法来启动其他的Activity。该方法用于启动指定Activity,而且期望获取指定Activity返回的结果。为了获取被启动的Activity所返回的结果,需要从两个方面入手:

(1)当前的Activity需要重写OnActivityResult方法,当被启动的Activity返回结果时,该方法将会被触发。

(2)被启动的Activity中需要调用SetResult方法设置处理结果;第一个Activity布局文件就一个按钮,两个testView用于显示返回结果,Activity的代码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    private final static String TAG="MainActivity";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btnOpen=(Button)this.findViewById(R.id.openActiviy);
        btnOpen.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                //得到新打开Activity关闭后返回的数据
                //第二个参数为请求码,可以根据业务需求自己编号
                startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
            }
        });
    }
    
    /**
     * 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
     * 
     * requestCode 请求码,即调用startActivityForResult()传递过去的值
     * resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	Bundle pluginBundle=data.getExtras();//用Bundle得到新Activity 关闭后返回的数据
	String name=pluginBundle.getString("name");
	String info=pluginBundle.getString("info");
	TextView textName=(TextView)this.findViewById(R.id.name);
	TextView textInfo=(TextView)this.findViewById(R.id.info);
      	textName.setText(name);
        textInfo.setText(info);
    }
}
 第二个Activity的布局中就一个返回按钮,Activity源码如下: 
<pre name="code" class="java">package com.test.activitys;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class OtherActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.other);

        Button btnClose=(Button)findViewById(R.id.close);
        btnClose.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                //数据是使用Intent返回
                Intent resultIntent=getIntent();
		Bundle bundle=new Bundle();
		bundle.putString("name", t"guanxi");
		bundle.putString("info", "ilovetakephotos!");
		//把返回数据存入Intent
		resultIntent.putExtras(bundle);
		//设置返回数据
		OtherActivity.this.setResult(0, resultIntent);
		//关闭Activity
		OtherActivity.this.finish();

            }
        });
        
    }

}
 
 
上面的实例中,当我们点击第一个Activity的按钮是就会打开第二个Activity,在第二个Activity中点击关闭按钮,将会关闭第二个Activity并返回第一个Activity中。在第一个Activity中我们就可以在OnActivityResult中捕捉到返回信息,并可将其显示在TextView上。

2.点击返回键遇到的问题

当我们启动了第二个Activity,但是我们不点击关闭按钮,而是直接点模拟器的返回键,也会返回到第一个Activity中,但是一返回,程序就崩溃了,报错: unfortunately 程序名 has stopped。
我们上面提出了使用StartActivityForResult应该从两方面入手:
        (1)当前的Activity需要重写OnActivityResult方法,当被启动的Activity返回结果时,该方法将会被触发。
(2)被启动的Activity中需要调用SetResult方法设置处理结果;
       出现这个问题的原因是因为没有满足上面我们提到的两个方面的第二点: 被启动的Activity中需要调用SetResult方法设置处理结果。当我们直接点击返回键返回是,程序默认调用的是父类的onkeydown方法进行处理,这样就没有设置返回信息了,而第一个Activity中实现了OnActivityResult方法来获取返回信息,获取一个不存在的信息自然就会出错。

3.解决的办法

尽然问题出现在点击返回键没有设置返回信息上,解决方法肯定就从点击返回键的消息响应函数上入手了。(1)在返回键的消息响应回调函数中设置返回信息,(2)屏蔽返回键消息 (3)在返回消息的回调函数中判断返回消息是否为空
第一种解决方法:在第二个Activity中实现返回键的消息响应函数,并设置返回消息为空。具体代码如下:
	//覆写按键按下消息
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		//判断是否是返回键
		if(keyCode==KeyEvent.KEYCODE_BACK){
			//获取Intent
			Intent resultIntent=getIntent();
			//通过bundle设置返回消息
			Bundle bundle=new Bundle();
			bundle.putString("name", "");
			bundle.putString("info", "");
			resultIntent.putExtras(bundle);
			OtherActivity.this.setResult(0, resultIntent);
			OtherActivity.this.finish();
			
		}
		
		
		return super.onKeyDown(keyCode, event);
	}
	
}

第二种方法:直接软屏蔽返回键消息,所谓软屏蔽就是在第二个Activity中实现返回键消息响应函数,但是不做任何操作也不调用父类的返回键消息处理函数:就想很多我们用过的App中,当我们打开某个页面的时候却怎么点返回键都没有反应一样。
 
	//覆写按键按下消息
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		//判断是否是返回键
		if(keyCode==KeyEvent.KEYCODE_BACK){
			//直接返回
			return false;
		}else return super.onKeyDown(keyCode, event);

	}
	
}
第三种方法:最好的习惯就是在onActivityResult中判断intent data是否为空:
		public void onActivityResult(int requestCode, int resultCode,
				Intent data) {
			if(data==null){
			……//相应的处理
			}
          <span style="white-space:pre">		</span>  ……//相应的处理
}


个人 学习心得,不喜勿喷)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值