1.Activity概述
2.状态与生命周期(三大状态与七大方法)
状态
生命周期
onCreate():创建Activity第一个被调用的方法,用于加载布局,初始化UI组件,注册事件;
onStart():在onCreate()之后被调用,用于显示界面,但界面与用户还不能进行交互;
onResume():在onStart()之后被调用,该方法执行完成后,用户与界面可以进行交互,当前Activity进入resumed状态(运行状态);
当一个paused状态的Activity重新返回时,会再次调用该方法,让Activity进入运行状态;
onPause():当其他Activity(透明或窗口模式)进入时,该方法会被调用,让当前Activity进入paused状态(暂停状态);
当前Activity还可见但不可交互,如果其他更高级别的App需要内存时,当前Activity可能会被销毁(killed);
当前Activity被返回时,会调用onResume()方法;
onStop():当其他Activity完全覆盖该Activity时,会被调用,当前Activity进入stopped状态(停止状态);
不可见,如果其他更高级别的APP需要内存时,当前Activity可能会被销毁(killed);
当前Activity被返回时,会调用onRestart()方法;
onRestart():当一个stopped的Activity被返回时时调用,之后再调用onResume()进入resumed状态(运行状态);
onDestroy():当前Activity被销毁时调用,通常用来释放资源,当前Activity killed;
3.传递简单数据
MainActivity
package com.example.activitytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText1); } public void sendClick(View v){ Intent intent = new Intent(this,Activity2.class); String info = editText.getText().toString(); // 传递数据 // 方式一:通过Bundle封装数据,再把数据放入intent,Activity2得到数据是逆向的 // Bundle data = new Bundle(); // data.putString("info", info); // intent.putExtra("data", data); // 方式二:直接调用 intent.putExtra("info", info); startActivity(intent); } }
Activity2
package com.example.activitytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class Activity2 extends Activity{ private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_2); textView = (TextView) findViewById(R.id.tv_2); Intent intent = getIntent(); // Bundle data = getIntent().getBundleExtra("data"); // String info = data.getString("info"); String info = intent.getStringExtra("info"); textView.setText(info); } }
4.传递自定义对象数据
通过自定义类实现Serializable接口和Parcelable接口来传递自定义对象的数据
Cat.java
package com.example.activitytest; import java.io.Serializable; public class Cat implements Serializable{ String name; int age; String type; @Override public String toString() { return "Cat [name=" + name + ", age=" + age + ", type=" + type + "]"; } }
Dog.java
package com.example.activitytest; import android.os.Parcel; import android.os.Parcelable; public class Dog implements Parcelable{ String name; int age; String type; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeString(name); dest.writeInt(age); dest.writeString(type); } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + ", type=" + type + "]"; } public static final Parcelable.Creator<Dog> CREATOR = new Parcelable.Creator<Dog>() { public Dog createFromParcel(Parcel in) { Dog dog = new Dog(); dog.name = in.readString(); dog.age = in.readInt(); dog.type = in.readString(); return dog; } public Dog[] newArray(int size) { return new Dog[size]; } }; }
MainActivity.java
package com.example.activitytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText1); } public void sendClick(View v) { Intent intent = new Intent(this, Activity2.class); String info = editText.getText().toString(); // 传递数据 // 方式一:通过Bundle封装数据,再把数据放入intent,Activity2得到数据是逆向的 // Bundle data = new Bundle(); // data.putString("info", info); // intent.putExtra("data", data); // 方式二:直接调用 intent.putExtra("info", info); startActivity(intent); } public void sendobj1Click(View v) { Cat cat = new Cat(); cat.name = "皮卡丘"; cat.age = 2; cat.type = "美短"; Intent intent = new Intent(this, Activity2.class); intent.putExtra("cat", cat); startActivity(intent); } public void sendobj2Click(View v) { Dog dog = new Dog(); dog.name = "汪汪"; dog.age = 1; dog.type = "萨摩耶"; Intent intent = new Intent(this, Activity2.class); intent.putExtra("dog", dog); startActivity(intent); } }
Activity2.java
package com.example.activitytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class Activity2 extends Activity{ private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_2); textView = (TextView) findViewById(R.id.tv_2); Intent intent = getIntent(); // Bundle data = getIntent().getBundleExtra("data"); // String info = data.getString("info"); // String info = intent.getStringExtra("info"); // textView.setText(info); // Cat cat = (Cat) intent.getSerializableExtra("cat"); // textView.setText(cat.toString()); Dog dog = intent.getParcelableExtra("dog"); textView.setText(dog.toString()); } }
5.处理返回结果
调用startActivity()方法,并且重写onActivityResult()方法:接收三个参数:requestCode(在starttActivityResult中设置)、resultOK(在点击事件设置)、data;
点击事件onItemClick:先根据position得到数据,定义为字符串类型,在调用intent的putExtra方法放入数据,再调用setResult方法,然后finish();
具体onActivityResult()代码:使用if语句,如果requestCode和resultCode都满足要求,就getStringExtra(),然后再editText中setText();
要实现点击按钮模拟拨号的界面,调用intent的setAction()传入Intent.ACTION_CALL,再调用setData方法传入Uri.parse("tel:"+number);
最后别忘了在清单文件中加入CALL_PHONE的权限
本节踩过好多坑啊!!!代码量还是不够,还是经验不足啊!!!
1.RESULT_O我居然自己赋值了,要哭!
2.自己创建的Activity忘记在清单文件中注册了!
3.实现接口类的监听事件忘记在onCreate里注册了!
4.getIntent()方法乱用啊!得是new Intent()!
5.忘记在清单文件里添加打电话的用户权限了!
MainActivity
package com.example.callphonetest; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { private static final int REQUEST_CODE = 0x1; private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText1); } public void selectClick(View v){ Intent intent = new Intent(this,PhoneNumberActivity.class); startActivityForResult(intent, REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(requestCode==REQUEST_CODE&&resultCode==RESULT_OK){ String number = data.getStringExtra("number"); editText.setText(number); } } public void callClick(View v){ String number = editText.getText().toString(); Intent intent = new Intent();//这里写getIntent()_就不行了,哎,还是太嫩,很多都不懂 intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); } }
PhoneNumberActivity
package com.example.callphonetest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class PhoneNumberActivity extends Activity implements OnItemClickListener{ private ListView listView; private String[] numbers ={"131****2160","10010","1001011","159****4296"}; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.number_layout); listView = (ListView) findViewById(R.id.listView); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,android.R.id.text1,numbers); listView.setAdapter(adapter); listView.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub String number = numbers[position]; Intent intent = new Intent(this,MainActivity.class); intent.putExtra("number", number); setResult(RESULT_OK, intent);//在RESULT_OK这里醉了,收REQUEST_CODE影响,惯性思维也给它赋了一个值,我死去的时间啊!!! finish(); } }
6.屏幕方向与显示方向
7.屏幕方向旋转
屏幕旋转后,默认会重新创建一个Activity,为了保存之前Activity状态,可以重写onSaveInstanceState()方法来保存相关数据,然后在onCreate()方法里还原数据
8.SharedPreferences
Activity通过SharedPreferences保存数据
MainActivity
package com.example.sharedpreferencestest; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.TextUtils; import android.widget.EditText; public class MainActivity extends Activity { private EditText editText; private SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText1); sp = getSharedPreferences("msg", Context.MODE_PRIVATE); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.setText(sp.getString("msg", "")); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); String msg = editText.getText().toString(); if(TextUtils.isEmpty(msg)){ return; } SharedPreferences.Editor editor = sp.edit(); editor.putString("msg", msg); editor.commit(); } }