1. Android中的四大组件,只要你定义了,无论你用没用,都要在AndroidManifest.xml对 这个组件进行声明,不然运行时程序会直接退出,报ClassNotFindException...
2. 启动一个Activity的方式,分为显示启动和隐式启动。
1. 显式启动:通过包名来启动,写法如下:
①最常见的:startActivity(new Intent(当前Act.this,要启动的Act.class));
②通过Intent的ComponentName:
ComponentName cn = new ComponentName("当前Act的全限定类名","启动Act的全限定类名") ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;
③初始化Intent时指定包名:
Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("当前Act的全限定类名","启动Act的全限定类名");
startActivity(intent);
2.隐式启动:通过Intent-filter的Action,Category或data来实现 这个是通过Intent的 intent-filter**来实现的,关于intent的相关的学习,之后会总结。
3. 直接通过包名启动apk:
Intent intent = getPackageManager().getLaunchIntentForPackage
("apk第一个启动的Activity的全限定类名") ;
if(intent != null) startActivity(intent) ;
3.Activity间数据传递:
1.使用Intent的putExtra传递
存数据:
//创建意图对象
Intent intent = new Intent(A.this,B.class);
//设置传递键值对
intent.putExtra("data",str);
//激活意图
startActivity(intent);
取数据:
// 获取意图对象
Intent intent = getIntent();
//获取传递的值
String str = intent.getStringExtra("data");
//设置值
tv.setText(str);
2.使用Intent的Bundle一次性传递多个数据:
存数据:
//创建意图对象
Intent intent = new Intent(A.this,B.class);
//用数据捆传递数据
Bundle bundle = new Bundle();
bundle.putString("data", str);
bundle.putInt("num",1);
//把数据捆设置改意图
intent.putExtra("bun", bundle);
//激活意图
startActivity(intent);
取数据:
//获取Bundle
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("bun");
String str = bundle.getString("data");
tv.setText(str);
3.使用Activity销毁时传递数据
存数据:
Intent intent = new Intent(A.this,B.class);
//用一种特殊方式开启Activity
startActivityForResult(intent, 11);
//设置数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String str = data.getStringExtra("data");
tvOne.setText(str);
}
取数据:
//设置返回的数据
Intent intent = new Intent();
intent.putExtra("data", edtOne.getText().toString().trim());
setResult(3, intent);
//关闭当前activity
finish();
4.SharedPreferences传递数据
存数据:
SharedPreferences sp = this.getSharedPreferences("info", 1);
//获取sp编辑器
Editor edit = sp.edit();
edit.putString("data", str);
edit.commit();
//创建意图对象
Intent intent = new Intent(A.this,B.class);
//激活意图
startActivity(intent);
取数据:
SharedPreferences sp = this.getSharedPreferences("info", 1);
//设置数据
tv.setText(sp.getString("data", ""));
此外,还可以使用序列化对象Seriazable和静态变量传递数据传递数据。
4.设置Activity全屏的方法:
1. 代码隐藏ActionBar:
在Activity的onCreate方法中调用getActionBar.hide();即可
2. 通过requestWindowFeature设置:
requestWindowFeature(Window.FEATURE_NO_TITLE); 该代码需要在setContentView ()之前调用,不然会报错!!!
注: 把 requestWindowFeature(Window.FEATURE_NO_TITLE);放在super.onCreate(savedInstanceState);前面就可以隐藏ActionBar而不报错。
3. 通过AndroidManifest.xml的theme
在需要全屏的Activity的标签内设置 theme = @android:style/Theme.NoTitleBar.FullScreen
5.Activity四种启动模式
1.standard:标准启动模式,也是activity的默认启动模式。在这种模式下启动的activity可以被多次实例化,即在同一个任务中可以存在多个activity的实例,每个实例都会处理一个Intent对象。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A,即调用startActivity(new Intent(this,A.class)),会在A的上面再次启动一个A的实例,即当前的桟中的状态为A-->A。
2.singleTop:如果一个以singleTop模式启动的activity的实例已经存在于任务桟的桟顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中。举例来说,如果A的启动模式为singleTop,并且A的一个实例已经存在于栈顶中,那么再调用startActivity(new Intent(this,A.class))启动A时,不会再次创建A的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()方法。这是任务桟中还是这有一个A的实例。如果以singleTop模式启动的activity的一个实例已经存在与任务桟中,但是不在桟顶,那么它的行为和standard模式相同,也会创建多个实例。
3. singleTask:谷歌的官方文档上称,如果一个activity的启动模式为singleTask,那么系统总会在一个新任务的最底部(root)启动这个activity,并且被这个activity启动的其他activity会和该activity同时存在于这个新任务中。如果系统中已经存在这样的一个activity则会重用这个实例,并且调用他的onNewIntent()方法。即,这样的一个activity在系统中只会存在一个实例。其实官方文档中的这种说法并不准确,启动模式为singleTask的activity并不会总是开启一个新的任务。
4.singleInstance:总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity会自动运行于另一个任务中。当再次启动该activity的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。