安卓学习-activity

1、AndroidManifest.xml
< application
android :allowBackup= "true"
android :icon= "@mipmap/ic_launcher"
android :label= "@string/app_name"
android :supportsRtl= "true"
android :theme= "@style/AppTheme" >
< activity android :name= ".HelloWorldActivity" >
< intent-filter > <!--下面两行表示是 主活动-->
< action android :name= "android.intent.action.MAIN" />
< category android :name= "android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
</ application >

2、toast
Button button1 = ( Button ) findViewById(R.id. button_1 );
button1.setOnClickListener( new View.OnClickListener() { // 为button1 注册一个监听器
@Override
public void onClick(View v) { //当button1 被点击时,添加回调方法
//参数1是上下文, 参数2是toast显示的文本, 第三个是时长(Toast.LENGTH_SHORT, Toast.LENGTH_LONG)
Toast. makeText (FirstActivity. this , "you clicked the button1" , Toast. LENGTH_LONG ).show();

}
});

3、右上角的菜单项:
(1)写一个菜单项的布局:
<? 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 >

(2)在当前活动中注册右上角菜单项
// 返回true, 那么可以在当前活动中显示菜单项
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu. main , menu);
return true ;
}


4、监听菜单项点击事件
//这里是给 菜单项 添加监听事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id. add_item :
Toast. makeText ( this , "You clicked Add" , Toast. LENGTH_SHORT ).show();
break ;
case R.id. remove_item :
Toast. makeText ( this , "You clicked Remove" , Toast. LENGTH_SHORT ).show();
break ;
default :
}
return true ;
}


5、销毁活动
直接调用活动的全局函数:finish();就行了形如:



6、活动中穿梭以及调用其他软件的activity
(1)显式 intent
// 第一个参数是当前的应用上下文,第二个参数是需要打开的那个activity的class
Intent intent = new Intent(FirstActivity. this , SecondActivity. class );
startActivity(intent);

(2)隐式intent
在minifast.xml中注册activity的时候用了<action>和<category>这两个标签。那么当一个intent中的action和category完全匹配上,才能调用隐式的活动
< activity
android :name= ".SecondActivity"
android :launchMode= "singleInstance" >
< intent-filter >
< action android :name= "com.example.activitytest.ACTION_START" />
< category android :name= "android.intent.category.DEFAULT" />
< category android :name= "com.example.activitytest.MY_CATEGORY" />
</ intent-filter >
</ activity >

Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
(第二个category参数没有填写,是因为android.intent.DEFAULT是一种默认的category,在调用startAction()的时候会自动将这个category添加到Intent中)


如果要加category,那么在中间插一句:
intent.addCategory("com.example.activitytest.MY_CATEGORY")
然后再startActivity(intent);就可以了

(3)更多隐式intent:
不仅仅可以启动自己程序里面的活动,其实还可以启动其他程序的活动

——调用浏览器:
button1.setOnClickListener( new View.OnClickListener() { // 为button1 注册一个监听器
@Override
public void onClick(View v) { //当button1 被点击时,添加回调方法
Intent intent = new Intent(Intent. ACTION_VIEW );
//这里冒号之前的http指的是http协议,对应于scheme中的协议头
intent.setData(Uri. parse ( "http://www.baidu.com" ));
startActivity(intent);
}
}


——调用电话:
button1.setOnClickListener( new View.OnClickListener() { // 为button1 注册一个监听器
@Override
public void onClick(View v) { //当button1 被点击时,添加回调方法
Intent intent = new Intent(Intent. ACTION_VIEW );
//这里冒号之前的http指的是telp协议,对应于scheme中的协议头
intent.setData(Uri. parse ( "tel:10086" ));
startActivity(intent);
}
}

7、活动中传递数据:
button1 .setOnClickListener( new View.OnClickListener() { // 为button1 注册一个监听器
@Override
public void onClick(View v) { //当button1 被点击时,添加回调方法
String data = "hello yaoyao" ;
Intent intent = new Intent(FirstActivity. this , SecondActivity. class );
intent.putExtra( "extra" , data);
startActivity(intent);
}
});

数据接收方
Intent intent = getIntent();
String data = intent.getStringExtra( "extra" );
Log. d ( "second onCreate" , data);

8、返回数据给上一个活动
第一个活动
button1 .setOnClickListener( new View.OnClickListener() { // 为button1 注册一个监听器
@Override
public void onClick(View v) { //当button1 被点击时,添加回调方法
String data = "hello yaoyao" ;
Intent intent = new Intent(FirstActivity. this , SecondActivity. class );
//第二个参数是请求码,只要是唯一参数就可以
startActivityForResult(intent, 1 );
}
});

第二个活动:
button2 .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
//这里的intent初始化的时候并没有指定class,只是用来传递数据
intent.putExtra( "data_return:" , "hello my yaoyao" );
//这里的setResult, 第一个参数:向上一个活动返回吃力结果,一般为RESULT_OK,或RESULT_CANCELED
//第二个参数就是把带有数据的Intent传递回去
setResult( RESULT_OK , intent);
finish();

}
});

第一个活动接受第二个活动的参数:
@Override
//第一个参数是启动第二个活动时传入的请求码,第二个参数是上个页面的处理结果,第三个就是数据
protected void onActivityResult( int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1 :
if (resultCode == RESULT_OK ) {
String returnedData = data.getStringExtra( "data_return" );
Log. d ( "FirstActivity" , returnedData);
}
break ;
default :
}
}

如果用户点击返回键回到上个界面:
那么重写返回键的相应方法就可以了:

public void onBackPressed() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
//这里的intent初始化的时候并没有指定class,只是用来传递数据
intent.putExtra( "data_return:" , "hello my yaoyao" );
//这里的setResult, 第一个参数:向上一个活动返回吃力结果,一般为RESULT_OK,或RESULT_CANCELED
//第二个参数就是把带有数据的Intent传递回去
setResult( RESULT_OK , intent);
finish();

}
});

9、活动的生命周期
运行状态,暂停状态,停止状态,销毁状态

完整生存期:onCreate() 到 onDestroy()
onCreate():活动第一次被创建的时候调用

一个活动会在onCreate 完成各种初始化操作,在onDestroy中释放内存
可见生存期:onStart() 到 onStop()
onStart() 活动由不可见变为可见的时候调用
onStop() 活动完全不可见的时候调用(非dialog)

前台生存期:onResume() 到 onPause()
onResume(): 活动准备好和用户交互的时候调用
onPause(): 这个方法在系统准备去启动或者恢复另一个活动的时候调用
通常用来释放一些消耗cpu的资源和保存数据。


onRestart() 从停止状态变为运行状态之前调用。

10、在活动被销毁之前一定会保存数据:
onSaveInstanceState()会携带一个Bundle类型的参数,
Bundle提供了一些列方法来保存数据:putString(),putInt();

保存本页面数据:
@Override
//这个方法是在这个活动被系统回收之前,保存页面中的数据;
//恢复数据在onCreate()方法中
protected void onSaveInstanceState(Bundle outState){
super .onSaveInstanceState(outState);
String tempData = "hello my love" ;
outState.putString( "data_key" , tempData);
}

恢复本页面数据就是用这个方法:
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
Log. d ( "FirstActivity" , "Task id is " + getTaskId());
setContentView(R.layout. first_layout );
if (savedInstanceState != null ){
String tempData = savedInstanceState.getString( "data_key" );
Log. d ( TAG , tempData);
}
}


11、活动的启动模式
在androidManifast.xml中的<activity>中指定android:launchMode属性来选择启动模式
(1)standard(默认模式)
他不会在乎你想启动的活动是不是已经在栈顶了,反正会创建个新的
(2)singleTop
<activity:launchMode="singleTop">
如果要创建的活动已经在栈顶了就不会创建,如果不再栈顶,就会创建新的
(3)singleTask
<activity:launchMode="singleTask">
如果要创建的活动在栈中已经存在,那么,会把它上面的多有活动都干掉
(4)singleInstance
打开使用这个就是把活动放在一个单独的栈里面,
当点击返回的时候,返回的都是自己程序活动栈里面的活动,
当当前活动出栈结束,才会显示singleInstance里面的活动

ps:活动当前活动所在栈的id,直接使用全局方法:getTaskId()



12、小技巧:为所有活动添加一个父类
这样的话类似于python的修饰器,
可以做一些全局操作,例如知道自己在什么活动中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
Log. d ( "BaseActivity" , getClass().getSimpleName());
ActivityCollector. addActivity ( this );
}

13、随时随地退出程序
用一个专门的集合类来管理所有的活动:
在任何地方调用 ActivityCollector.finishAll() 就可以杀掉所有的活动

import android.app.Activity;
import java.util.ArrayList;
import java.util.List;
public class ActivityCollector {
public static List<Activity> 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 activity : activities ) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}

然后在BaseActivity中,
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
Log. d ( "BaseActivity" , getClass().getSimpleName());
ActivityCollector. addActivity ( this );
}
@Override
protected void onDestroy() {
super .onDestroy();
ActivityCollector. removeActivity ( this );
}
}


14、杀掉程序进程
只能杀死当前程序的进程,是不可以杀死别人的
android.os.Process.killProcess(android.os.Process.myPid())

15、启动活动的最佳写法
public static void actionStart(Context context, String str){
Intent intent = new Intent(context, SecondActivity. class );
intent.putExtra( "data" , str);
context.startActivity(intent);
}
使用的时候,直接调用:
actionStart (FirstActivity. this , "guanjia" );






























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值