android开发之activity

  1. Activity:界面交互
  2. Intent: 数据传递

###一个主界面

<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

其中"android.intent.action.MAIN"表示主界面,apk启动时大多从这里开始启动.
"android.intent.category.LAUNCHER"展示在系统的LAUNCHER中,没有这个就没有启动图标。

###创建一个菜单
首先创建一个菜单的布局文件

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
<item
android:id="@+id/exit_item"
android:title="Exit"/>
</menu>

Activity中实现

//设置菜单界面
//返回值true表示显示
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
//相应菜单事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.add_item:
Toast.makeText(MyActivity.this,"add_item",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(MyActivity.this,"remove_item",Toast.LENGTH_SHORT).show();
break;
case R.id.exit_item:
finish();
break;
default:
break;
}
return true;
}

###界面间交互
用Intent进行参数传递
首先是 AndroidManifest.xml文件中如下声明

<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.cn.yllen.myapplication.ACTION_START" />
<category android:name="com.cn.yllen.myapplication.MY_CATECORY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

####分别有显式隐式两种intent方式启动activity

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(MyActivity.this,"Hi~~",Toast.LENGTH_SHORT).show();
//显示 intent
//Intent intent = new Intent(MyActivity.this,SecondActivity.class);
//隐式 intent
Intent intent = new Intent("com.cn.yllen.myapplication.ACTION_START");
intent.addCategory("com.cn.yllen.myapplication.MY_CATECORY");
startActivity(intent);
}
});

####打开网页

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://ring3.xyz"));
Toast.makeText(SecondActivity.this,Uri.parse("http://ring3.xyz").toString(),Toast.LENGTH_SHORT).show();
startActivity(intent);

####传递参数 & 接收参数

String data = "你好世界";
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
/*-----------*---------------*-----------*/
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d(TAG, "onCreate: " + data);

####启动activity并获取返回值

// 通过startActivityForResult方法启动activity并获得返回数据
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivityForResult(intent,1);
//同时需要重写 onActivityResult 方法,以便获取返回值
@Override
protected
void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case 1:
if (resultCode == RESULT_OK)
{
String returnedData = data.getStringExtra("ret_data");
Log.d(TAG, "onActivityResult: " + returnedData);
}
break;
default:
break;
}
}
/*----------------*------------*---------------*/
// 被启动的activity,通过 setResult方法 返回数据
Button button = (Button) findViewById(R.id.button_3);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("ret_data","这是返回值哦~");
setResult(RESULT_OK,intent);
finish();
}
});

activity生存期


启动模式

声明方式

<activity
...
android:launchMode="xx">
...
</activity>

standard:每次都生成一个新的activity放在栈顶

startActivity(xx.this,xx.class);
startActivity(xx.this,xx.class);
startActivity(xx.this,xx.class);
//则需要按三次back键进行返回

singleTop:仅当不在栈顶时生成

//当前界面可视
startActivity(xx.this,xx.class);
startActivity(xx.this,xx.class);
startActivity(xx.this,xx.class);
//则需要按一次back键进行返回

singleTask:全栈唯一

singleInstance:多栈

自定布局

首先自己完成一个布局类的子类

package com.cn.yllen.myapplication;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
/**
* Created by Administrator on 2017/2/27 0027.
*/
public class TitleLayout extends LinearLayout {
public TitleLayout(final Context context , AttributeSet attrs)
{
super(context,attrs);
LayoutInflater.from(context).inflate(R.layout.layout_title,this);
Button button1 = (Button) findViewById(R.id.title_back);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"back",Toast.LENGTH_SHORT).show();
}
});
}
}

对应的xml布局文件layout_title.xml实现如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bg">
<Button
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="3dp"
android:background="@drawable/back_bg"
android:text="Back"
android:textColor="#fff"
/>
<TextView
android:id="@+id/title_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="Title text"
android:textColor="#fff"
android:textSize="24sp"
android:background="@drawable/title_bg"
/>
<Button
android:id="@+id/button_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="3dp"
android:background="@drawable/edit_bg"
android:textColor="#fff"
android:text="确定3"
/>
</LinearLayout>

将上面布局文件引入其他布局中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.cn.yllen.myapplication.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.cn.yllen.myapplication.TitleLayout>
</LinearLayout>

效果图如下: