0.Android历史:
Andy Rubin创始人
2008年 谷歌正式发布Android 1.0系统。
1.开启主活动:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<intent-filter>
</activity>
2.获得res/values/strings.xml文件种HelloWorld的引用。
HelloWorld
第一种: 在代码中通过R.string.hello_world 可以获得该字符串的引用
第二种: XML中, 用@string/hello_world 可以获得该字符串的引用
第二章 探究活动
活动:可以包含用户界面的组件,主要用于和用户进行交互。
1.1 Toast 提醒工具
Toast.makeText(this, “提醒内容”, Toast.LENGTH_SHORT).show();
Toast.LENGTH_LONG
1.2 菜单 Menu
res目录下–>New–> Directory 文件夹名menu –>main文件
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="+id/add_item"
android:title="Add" />
<item
android:id="remove_item"
android:title="Remove" />
</menu>
在活动中重写onCreateOptionsMenu()方法。
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
1.3 销毁活动
在按钮的监听器中加一个单独的 finish();
2.1 Intent的使用
显式Intent:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
隐式Intent:
指定当前可以响应的活动,在AndroidManifest相应的中添加
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
在FirstActivity中的按钮点击事件中添加
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
注意:每个Intent只能指定一个Action, 却能指定多个Category。
1)更多隐式用法
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW) { //Intent.ACTION_DIAL拨号,不需要权限 Intent.ACTION_CALL 需要权限
intent.setData(Uri.parse("www.baidu.com"));
//intent.setData(Uri.parse("tel:10086"))
startActivity(intent);
}
}
});
—向下个活动传递数据
第一个活动
intent.putExtra("extra_data", data); //向下个活动传递数据,"extra_data"为键, data为值。
第二个活动
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data"); //如果是int型数据则是getIntExtra;布尔型即为getBooleanExtra();
—向上个活动返回数据
1.第一个活动
startActivityForResult(intent, 1); // 第二个参数表示的是用于区别其他的唯一值。
2.第二个活动的点击事件
Intent intent = new Intent();// 新建的Intent并没有传入具体的指向意图,仅仅是用于传递数据
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent); //一般第一个参数两个选择,RESULT_OK RESULT_CANCELED
finish();
3.再返回第一个活动时会回掉一个onActivityResult()方法,重写onActivityResult()
eg:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
}
break;
default:
}
}
3.1 活动的生命周期
onCreate; onStart; onResume; onPasue; onStop; onDestroy;
3.2 活动被回收 ,如何保证被回收之前进行保存
eg:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData); //同样的,"data_key"是键。
}
再向onCreate方法中还原临时数据
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d("MainActivity", "onCreate: "+ tempData);
}
}
3.3 活动启动的几种模式
可以在AndroidManifest的中修改模式。
eg:
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
standard模式:即默认模式,会将点击的新活动按照活动周期统统放到返回栈中,浪费内存。
singleTop模式: 如果在发现返回栈顶已经是该活动就不会创建新的活动,但是当从一个活动跳转到第二个活动,再跳转到第一个活动,还是会建立实例.
因为栈顶为第二个活动,而要建立的是第一个活动,所以会建立。
singleTask模式:先判断整个返回栈是否有该实例,如果有,那么将位于其上的实例全部出栈销毁,那么它就自然而然变成最上面的了。
singleInstance模式: 为了便于不同程序调用共同的活动,使用此模式单独建立一个返回栈进行存放。
3.4 随时退出程序
创一个class类,将每次创建的活动统一加进来,或者减去。
eg:
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);
}
}
建立父类BaseActivity继承AppCompatActivity. 以后创建的活动都继承于它就行了
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
public static void finishAll() {
for (Activity activity : activities) {
activity.finish();
}
}
}
3.5 可以将第一个活动的传递数据放到第二个活动写,这样可以通过第二个活动直接知道哪些数据。
eg:
第二个活动中:
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);
}
第一个活动中: 只要直接调用此方法,按照参数传递参数即可。