Android08-跨页面数据传递

1.Activity

1:一个Activity必须继承Activity类,同时重写onCreate方法,进行Activity的初始化操作。
2:要在AndroidManifest.xml中声明对应activity节点,在加载AndroidManifest.xml是调用对应Activity的onCreate方法。
3:AndroidManifest.xml中应该只有一个activity节点有intent-filter节点(intent-filter中的属性之固定),保证了应用在手机中只有一个入口。AndroidManifest.xml中有几个activity有intent-filter节点,并且属性值如下,就会在桌面产生几个图标。
4:在application和activity中还可以声明icon、label属性。icon制定桌面的图标,label制定桌面应用的名称。如果activity中没有icon、label属性则使用application的icon、label属性值。
<application
             android:allowBackup="true"
             android:icon="@drawable/head1" //图标
             android:label="hello" //应用名称
             android:theme="@style/AppTheme" >
    <activity
              android:name="com.my.android17.MainActivity"
              android:label="@string/app_name" >
        <!--表示这个activity是程序的入口 -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

2.打电话的页面跳转

public void call(View v){
    //使用Intent过滤要操作的Activity
    Intent intent = new Intent();
    //设置Intent的动作
    intent.setAction(Intent.ACTION_CALL);
    //设置Intent的数据
    intent.setData(Uri.parse("tel:" + 110));

    //打开Intent
    startActivity(intent);
}
//同时在AndroidManifest.xml添加<uses-permission android:name="android.permission.CALL_PHONE"/>使之拥有打电话的权限。
1:Intent是一个过滤器,会对封装的信息进行过滤。
2:打电话的Intent,通过设置的动作和数据的约束,会匹配到下面这个Intent。
<intent-filter>
	<action android:name="android.intent.action.CALL" />
	<category android:name="android.intent.category.DEFAULT" />
	<data android:scheme="tel" />
</intent-filter>

3.隐式意图

1:通过匹配Activity的意图过滤器来打开另一个画面,需要意图过滤器中的内容都被匹配。
2:如果一个Activity需要通过意图过滤器进行匹配,则必须添加intent-filter节点。
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void openOne(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.my.second");
    	intent.setData(Uri.parse("my:" + 1111));
    	
    	startActivity(intent);
    }
    
    public void openSecond(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.my.second");
    	
    	//setData会清除setType中设置的数据
    	//intent.setData(Uri.parse("my" + 1111));
    	
    	//setType会清除setData设置的数据
    	//intent.setType("my/m");
    	
    	intent.setDataAndType(Uri.parse("my:"), "my/m");
    	startActivity(intent);
    }
}
<activity
    android:name="com.my.androidpro18.SecondActivity" >
    <intent-filter>
        <action android:name="com.my.second" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="my" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.my.second" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="my" android:mimeType="my/m" />
    </intent-filter>
</activity>

4.显示意图

1:打开自己应用的Activity可以使用显示意图。
2:打开别人的Activity或者需要别人打开自己的Activity可以使用隐式意图。
3:通过显示意图打开自己的Activity,也需要将这个Activity加入到AndroidManifest.xml,不然会有错误have you declared this activity in your androidManifest.xml。
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void openThird(View v){
    	//打开自己的Activity
    	//Intent intent = new Intent(getApplicationContext(), ThirdActivity.class);
    	
    	//打开其他应用的Activity
    	Intent intent = new Intent();
    	intent.setClassName("com.my.androidpro18", "com.my.androidpro18.MainActivity");
    	startActivity(intent);
    }
}

5.页面数据传递小案列-1

public class MainActivity extends Activity implements OnClickListener{

    private EditText et_name;
	private RadioGroup rg_gender;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        et_name = (EditText) findViewById(R.id.et_name);
        rg_gender = (RadioGroup) findViewById(R.id.rg_gender);
        Button btn_cale = (Button) findViewById(R.id.btn_cale);
        
        btn_cale.setOnClickListener(this);
    }

	@Override
	public void onClick(View v) {
		String name = et_name.getText().toString();
		int buttonId = rg_gender.getCheckedRadioButtonId();
		boolean gender = true;
		if(buttonId == R.id.rb_female){
			gender = false;
		}
		
		System.out.println(gender);
		Intent intent = new Intent(getApplicationContext(),ResultActivity.class);
		intent.putExtra("name", name);
		intent.putExtra("gender", gender);
		startActivity(intent);
	}

}

public class ResultActivity extends Activity{

	private TextView tv_result;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);
        
        //获取打开这个页面的意图
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        boolean gender = intent.getBooleanExtra("gender", true);
        
        TextView et_info = (TextView) findViewById(R.id.et_info);
        et_info.setText("姓名:" + name + ",性别:" + (gender?"男":"女"));
        
        tv_result = (TextView) findViewById(R.id.tv_result);
        caleRP();
    }
	
	public void caleRP(){
		Random ran = new Random();
		int result = ran.nextInt(100);
		if(result>80){
			tv_result.setText("5");
		}else if(result>60){
			tv_result.setText("4");
		}else if(result>40){
			tv_result.setText("3");
		}else{
			tv_result.setText("2");
		}
	}
}

6.页面数据传递小案列-2

public class MainActivity extends Activity {
	
	String[] smss = new String[]{
			"1",
			"2",
			"3",
			"4",
			"5",
			"6"
	};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        ListView item = (ListView) findViewById(R.id.lv_item);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item,smss);
        item.setAdapter(adapter);
        item.setOnItemClickListener(new OnItemClickListener() {

        	/**
        	 * parent 被点击的ListView对应的View对象
        	 * view 被点击条目对应的View对象
        	 * position 被点击View在条目中的索引
        	 * id 被点击View在数据集合中的索引
        	 */
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				//获取点击View的内容
				String sms = smss[position];
				//创建Intent 打开发短信的Activity
				Intent intent = new Intent();
				//匹配这个 intent-filter
//				<intent-filter>
//	               <action android:name="android.intent.action.SEND" />
//	               <category android:name="android.intent.category.DEFAULT" />
//	               <data android:mimeType="text/plain" />
//	           </intent-filter>
				intent.setAction("android.intent.action.SEND");
				intent.setType("text/plain");
				//源码中使用sms_body来取出数据
				intent.putExtra("sms_body", sms);
				
				startActivity(intent);
			}
		});
    }
    
}

7.页面数据传递小案列-3

public class MainActivity extends Activity implements OnClickListener{

    private EditText et_number;
	private EditText et_content;
	private Button btn_contact;
	private Button btn_reply;
	private Button btn_send;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //获取组件
        et_number = (EditText) findViewById(R.id.et_number);
        et_content = (EditText) findViewById(R.id.et_smsContent);
        
        btn_contact = (Button) findViewById(R.id.btn_contact);
        btn_reply = (Button) findViewById(R.id.btn_reply);
        btn_send = (Button) findViewById(R.id.btn_send);
        
        //为按钮设置点击事件
        btn_contact.setOnClickListener(this);
        btn_reply.setOnClickListener(this);
        btn_send.setOnClickListener(this);
    }

	@Override
	public void onClick(View v) {
		
		int viewId = v.getId();
		if(viewId == btn_contact.getId()){
			//创建Intent 加载联系人的Activity
			Intent intent = new Intent(getApplicationContext(),ContactActivity.class);
			//startActivity(intent);
			//当打开页面需要返回时 可以使用startActivityForResult()
			startActivityForResult(intent, 11);
		}else if(viewId == btn_reply.getId()){
			Intent intent = new Intent(getApplicationContext(),ReplyActivity.class);
			startActivityForResult(intent, 12);
		}else if(viewId == btn_send.getId()){
			SmsManager smsManager = SmsManager.getDefault();
			//接收短信的号码
			String destinationAddress = et_number.getText().toString().trim();
			//短信服务中心的号码,使用默认传入null
			String scAddress = "";
			//短信的内容
			String text = et_content.getText().toString().trim();
			//发送是否成功的回执
			PendingIntent sentIntent = null;
			//是否接受的绘制
			PendingIntent deliveryIntent = null;
			//发送短信
			smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);
		}
	}

	/*
	 * 页面返回之后会调用这个方法 所以在这个方法中进行设置数据
	 * 一个页面可以打开不同的页面所要对于返回之后的操作 我们可以通过requestCode、resultCode进行判断
	 * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		//防止用户没有选择直接返回,然后使用data取数据,出现异常
		if(data == null){
			return;
		}
		
		if(requestCode == 11){
			//获取Intent传递的数据
			String number = data.getStringExtra("number");
			//设置数据
			et_number.setText(number);
		}else if(requestCode == 12){
			String sms = data.getStringExtra("sms");
			et_content.setText(sms);
		}
		
		
	}
}

public class ContactActivity extends Activity {
	
	//联系人的初始化数据
	private List<Contact> list = new ArrayList<Contact>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_contact);
		
		Contact contact = null;
		//初始化联系人数据
		for(int i = 0;i < 20;i++){
			contact = new Contact();
			contact.name = "张三" + i;
			contact.number = "1388888888" + i;
			list.add(contact);
		}
		
		ListView lv_contact = (ListView) findViewById(R.id.lv_contact);
		MyAdapter myAdapter = new MyAdapter();
		lv_contact.setAdapter(myAdapter);
		//为ListView的条目添加点击事件
		lv_contact.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				
				//封装返回页面是应该携带的数据
				String number = list.get(position).number;
				//通过Intent传递数据
				Intent intent = new Intent();
				intent.putExtra("number", number);
				//传递Intent
				setResult(2, intent);
				finish();
			}
			
		});
	}
	
	/**
	 * 当按下返回按钮的时候会调用这个方法,进行页面的返回
	 * 这个方法通过调用finish()实现页面返回
	 */
	@Override
	public void onBackPressed() {
		super.onBackPressed();
	}
	
	private class MyAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			//ListView加载数据
			View view = null;
			//没有可以使用的View
			if(convertView == null){
				view = View.inflate(getApplicationContext(), R.layout.item_contact, null);
			}else {
				view = convertView;
			}
			
			//获取item_contact的组件 并进行修改
			TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
			TextView tv_number = (TextView) view.findViewById(R.id.tv_number);
			
			Contact contact = list.get(position);
			
			tv_name.setText(contact.name);
			tv_number.setText(contact.number);
			
			return view;
		}
		
	}
}

public class ReplyActivity extends Activity {
	
	private String[] smss = {"我在写作业","我在打游戏","我在吃饭",
			"我在上网","我在购物"};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_reply);
		
		ListView lv_reply = (ListView) findViewById(R.id.lv_reply);
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item_reply,smss);
		lv_reply.setAdapter(adapter);
		lv_reply.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				String sms = smss[position];
				Intent intent = new Intent();
				intent.putExtra("sms", sms);
				
				setResult(1, intent);
				finish();
			}
			
		});
	}
}

8.Activity的四种状态

1:处于前台的状态,可见,而且可以和用户进行交互。
2:初于暂停状态,可见,但是不能被操作,透明的。
3:停止状态,不可见,也不能被操作。
4:销毁状态,activity被系统杀死,或者调用finish方法退出。

9.Activity状态对应的方法

1:onCreate,当Activity被创建的时候,调用这个方法。
2:onstart,走完这个方法,Activity可以被用户所看到。
3:onResume,执行完这个方法,Activity处于前台状态,可见、可操作。可以用这个方法加载数据。
4:onPause,执行完这个方法,Activity处于暂停状态(系统内存不足时进行销毁),可见、但不可操作。
5:onStop,执行完这个方法,Activity处于停止状态(系统内存需要被使用时进行销毁),不可见、不可操作。可以在这个方法中停止所有的关于刷新界面的操作。
6:onDestory,执行玩这个方法,Activity就会被系统销毁。可以在这个方法中释放资源。
7:从onStop到onResume状态时,会调用onRestart、onStart、onResume方法。

10.Activity任务栈

1:Activity使用栈的结构来保存Activity实例。
2:我们可以通过sdk提供的工具,来查看这个栈。这个工具的目录时,sdk/tools/hierarchyviewer.bat。
3:Activity的栈有四种状态,可以通过清单文件AndroidManifest.xml的<activity android:name="com.my.androidpro22.ContactActivity" android:launchMode="standard"></activity>进行配置。
4:launchMode启动模式有四种状态,standard,标准模式,也是默认模式。每次调用startActivity或者startActivityForResult就会创建一个Activity实例。
5:singleTop,如果这个实例在栈顶,要进行实例的创建,并不会成功,在栈顶时单例模式。
6:singleTask,在任务找中只有一个实例。如果栈中已经存在了Activity,那么再次使用这个Activity,不会创建新的实例。而是将栈中这个Activity上面的所有的Activity关闭,使得这个Activity处于栈顶。
7:singleInstan,当前设备中只有一个实例,并且这个实例使用单独的栈进行存储。这个实例会永远在最后进行关闭。

11.屏幕旋转时Activity的生命周期

1:屏幕旋转时,默认会先销毁,在创建新的Activity。
2:如果不想时用默认的,可以写死旋转的方向。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值