1,手动创建活动
2.创建和加载布局文件
app/src/main/res new->Directory layout ->first_layout
3.添加按钮操作
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1"/>
4.在activity中引用
setContentView( R.layout.first_layout );
5.注册活动: Manifest.xml
<activity android:name=".HelloWorldActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
6.在活动中使用Toast (定义Button1按钮)
Button button1 = (Button)findViewById(R.id.button_1 );
button1.setOnClickListener( new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText( HelloWorldActivity.this,"Cliected", Toast.LENGTH_SHORT ).show();
}
});
7.在活动中使用Menu
res 下 new DIR menu new main 菜单文件
<?xml version="1.0" encoding="utf-8"?>
<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" />
</menu>
8重写Activity的onCreateOptionsMenu() 方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate( R.menu.main, menu);
return true;
}
9.添加点击方法 重写 onOptionsItemSelected();
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch ( item.getItemId() ){
case R.id.add_item:
Toast.makeText( this,"clicked add", Toast.LENGTH_SHORT ).show();
break;
case R.id.remove_item:
Toast.makeText( this,"clicked remove", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
10.销毁一个活动
finish();
二,使用Intent在活动之间跳转
Intent是Android程序中各个组件交互的一种重要方式(分为显示和隐式)
显示的Intent交互
1.创建另一个空活动
2.创建样式文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/second_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.helloworld.SecondActivity">
<Button
android:id="@+id/button_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2"/>
</RelativeLayout>
3.修改Button1的响应函数来调用second_activity
button1.setOnClickListener( new View.OnClickListener(){
@Override
public void onClick(View v) {
// Toast.makeText( HelloWorldActivity.this,"Cliected", Toast.LENGTH_SHORT ).show();
Intent intent = new Intent( HelloWorldActivity.this,SecondActivity.class );
startActivity( intent );
}
});
隐式的Intent交互
隐式的并不明确指定要启动那个活动,而是指定了一系列更为抽象的 action和category信息
1.配置 <intent-filter> 标签
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
隐式启动 secondactivity
@Override
public void onClick(View v) {
// Toast.makeText( HelloWorldActivity.this,"Cliected", Toast.LENGTH_SHORT ).show();
// Intent intent = new Intent( HelloWorldActivity.this,SecondActivity.class );
// startActivity( intent );
Intent intent = new Intent( "com.example.activitytest.ACTION_START" );
intent.addCategory( "com.example.activitytest.MY_CATEGORY" );
startActivity( intent);
}
});
更多隐式Intent用法
自己建立一个可以打开网页的应用
Empty Activity ThirdActivity
页面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/third_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.helloworld.ThirdActivity">
<Button
android:id="@+id/button_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 3"
/>
</RelativeLayout>
修改Manifest.xml 中 ThirdActivity的注册信息
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
</intent-filter>
</activity>
除了http协议还有拨号协议,定位协议等等
Button button3 = (Button)findViewById( R.id.button_3);
button3.setOnClickListener( new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent( Intent.ACTION_DIAL );
intent.setData(Uri.parse("tel:13814047169") );
startActivity(intent);
}
});
三:活动的生命周期
-
1)onCreate()
这个方法在活动第一次创建的时候会被调用。注意,是第一次创建。如果活动从停止状态重新进入运行状态,是不会调用这个方法的
-
2)onStart()
这个活动由不可见进入可见的时候调用。比如,当从停止状态进入到运行状态会调用。比如,一个activity中打开一个对话框,再按返回键重新进入这个活动,这个方法是不会被调用的。
-
3)onResume()
当活动准备好和用户进行交互的时候调用。举例,现在许多同学在一起赛跑,老师说,下一组要跑步的走到起跑线,准备跑。此时就是onResume(),此时的活动一定位于前台,学生一定站在了跑道上,一个道理。
-
4)onPause()
当前活动需要去启动另一个活动,或者恢复另一个活动的时候去调用。这个方法中,我们可以将一些CPU资源等释放掉,因为当你不在前台了,处于暂停或者停止甚至是销毁状态了,就应该让出一些资源,减少系统的负担。
-
5)onStop()
活动完全不可见的时候调用。比如,当前activity启动了一个对话框式的活动,那么是不会执行onStop()的。但启动了一个全屏的activity,就会得到调用。
-
6)onDestroy()
这个很好理解,不用多说了,活动被销毁了,按返回键了,或者finish等
-
7)onRestart()
由停止状态变为运行状态了,被调用。如果是暂停状态变为运行状态,是不会被调用的。
四:活动的启动模式
standard singleTop singleTask singleInstance 可以在AndroidManifest.xml中通过给<activity>标签指定Android:launchMode属性来选择启动模式
1.standard 模式
每次启动新的活动都会在栈顶创建新的实例, 不管这个实例在栈中是否存在。 按返回键依次退出
2.singleTop 模式
当启动方式指定为singleTop时, 在启动活动时如果发现要启动的活动已经存在于栈顶,则直接使用不创建新的活动, 如果要启动活动不是在栈顶则还是会创建新的实例
3.singleTask
任务栈中只允许存在一个活动实例, 如果要启动的实例已经存在栈中,则直接使用该实例, 并把这个实例上所用活动统统出栈。
4.singleInstance
指定为singleInstance模式的活动会启动一个新的任务栈来管理这个活动,可以使用getTaskId() 函数来获取当前函数的任务栈。
五,开发过程中管理自己的活动
1.创建一个普通的Java文件,这个类继承于AppCompatActivity , 然后让其他活动继承这个类, 当加载页面时,当前活动的名称就会被打印出来
public class BaseActivity extends AppCompatActivity {
private static final String TAG = "BaseActivity";
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, getClass().getSimpleName() );
ActivityCollector.addActivity( this );
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity( this );
}
}
2.如何管理程序, 一个按钮就可以退出程序
让活动初始化的时候就把当前的活动添加到List容器中, onDestroy() 的时候销毁掉, 当需要退出当前App的时候, 只需要调用ActivityCollector.finishAll() 即可销毁所有的活动
public class ActivityCollector { public static List<Activity> activities; static { activities = new ArrayList<>(); } public static void addActivity( Activity activity ){ activities.add( activity ); } public static void removeActivity( Activity activity ){ activities.remove(activity); } public static void finishAll(){ for( Activity act : activities ){ if (!act.isFinishing() ){ act.finish(); } } } }
3.活动的启动方式。
为你的每个活动添加类似于如下的启动代码
例如给SecondActivity 活动添加如下的代码
public static void actionStart(Context context, String data1, String data2){
Intent intent = new Intent( context, SecondActivity.class );
intent.putExtra( "param1", data1 );
intent.putExtra( "param2", data2 );
context.startActivity(intent);
}
当需要给SecondActivity传递参数并启动SecondActivity的时候只需要调用如下代码
SecondActivity.actionStart( FirstActivity.this, "part1", "part2" );