自学android开发有一个半月了,《第一行代码》和《疯狂android讲义》也看完了,大部分代码都有自己敲过,也了解了android开发的整体结构。完整的app目前就写过一个天气的MyWeather,能实现天气查询,后台定时更新,下拉刷新等基本功能。
随着学习深入,发现要学的东西非常多,根本不可能在短时间达到熟练并成为一个合格android程序员,于是想找一个实习的工作,能在这样的氛围下效率地学习。
在此请问有没有好心的前辈给个实习的机会或者贵公司需要免费的实习生? 我住在上海松江,公司在上海的都可以,先谢谢了!。安排给我工作都会努力完成,就算当时不会,也会自己寻找解决的途径。
回归正题,自学日记其实是记录和整理我所学的知识的。包含一些个人的理解,可能并不都是正确的。如果有不恰当的地方,希望不吝指正。
Activity是android应用中与用户直接交互的组件,也就是看得见界面。Activity本质是一个类,这个类中有很多方法,可以实现与用户的交互,例如点击,滑动等操作。而用户看得到视图和界面是通过加载XML布局文件来实现的。
创建一个Acitivity首先需要创建一个类继承自Activity或者其子类,如:AccountAuthenticatorActivity(实现账户管理界面的Acitivity)、ListActivity(实现列表的Activity)、PreferenceActivity(实现程序参数设置,存储界面的Activity)等。
public class MyActivity extends Activity {
然后重写onCreate方法,这个回调方法是在活动创建的时候调用的,因此可以将启动Activity的准备工作都写在这个方法中,例如setContentView()方法加载布局。
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeathure(Window.FEATURE_NO_TITLE);//隐藏标题栏
setContentView(R.layout.my_activity);//加载布局
}
其中savedInstanceState是Bundle类的实例, Bundle类提供一系列的方法用于保存数据,类似与Map通过键值对的形式保存。这里onCreate()方法中传入的savedInstanceState参数是Activity启动时可能需要传入的数据,可以在该Activity通过重写onSaveInstanceState()方法来保存需要存储的数据,(此方法保证会在活动背回收之前调用)。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setContentView(R.layout.my_activity);
String data = "Something need Saving";
outState.putString("data_key",data);
}
保存的数据可以通过onCreate()的savedInstanceState参数调用getXxx()取出:
if(savedInstanceState!=null){
String getData = savedInstanceState.getString("dat_key");
}
当一个Activity编写完成需要在AndroidManifest.xml文件中注册才能被使用。AndroidManifest.xml是一个清单文件,说明了该应用的名称、图标以及所包含的所用组件。
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
其中:
android:name属性指该Actvity实现类的类名,“.”前面省略了包名;
还可以添加其他属性:
android:icon指定该Actvity的图标;
android:label指定该Actvity的标签;
android:expored指定该Actvity是否允许被其他应用调用;
android:launchMode指定该Actvity的启动模式,见下文;
intent-filter属性中action与category指定此Acitivity为应用的启动Activity,即打开就是显示此Activity,详细内容见之后的Intent篇。
指定为应用的启动Activity,只要点击应用图标就能启动此Activity。
其他Activity则是通过startActivity()或者startActivityForResult()方法实现,这两个方法都需要传入一个Intent对象。
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
startActivityForResult(intent,1);//另一个参数是请求码
通过startActivityForResult()方法启动的Activity需要重写onActivityResult()方法返回结果,而startActivityForResult()方法中的另一个参数是int类型的请求编码,用于区别启动的多个Activity。
//三个参数分别是请求码、结果码、Intent对象
onActivityResult(1,1,intent);
按下返回键关闭Activity;
在代码中调用finish()结束当前Activity;
finish();
finishActivity(int requestCode)方法结束以startActivityForResult()方法启动的Activity;
看图片中描述其实就很清楚了,不同的阶段会调用对应的回调方法,所要做的事写在对应方法中就可以了。
<activity android:name=".MyActivity" android:launchMode="standard">
Activity的启动模式即为上文说到的android:launchMode属性,该属性有4个选项:
1.standard 默认模式;
2.singleTop Task栈顶单例模式;
3.singleTask Task内单例模式;
4.singleInseance 全局单例模式;
要了解这几种模式的区别,先要了解什么是Task。Task是android管理Activity的工具,可以看做是一个容器,也可以称作返回栈(BackStack)。每次启动一个Activity就是创建一个该Acitivity的实例并放入这个容器中,按照先后顺序从下至上排列,每次按Back就是将容器中最上面的Activity实例销毁,因此这是一个先进后出的容器,而最上方的Activity实例就是用户看到的界面。
standard模式: Activity可以无限制地创建实例;
singleTop模式:当Activity的实例在栈顶时,启动该Activity不再创建该Activity的实例,而是复用栈顶的那个实例;
singleTask模式:只要在栈中有 该Activity的实例,再次启动该Activity不再创建该Activity的实例,而是将栈中 该Activty实例 上方的 其他Activty实例 移出栈,从而使得该Activty实例处于栈顶位置;
singInstance模式:该Acitivity只会创建一个实例,并单独放在一个栈中;
一、知晓当前是在哪一个活动:
新建一个BaseActivity类继承自Activity作为项目的基类;
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());//获取当前实例的类名
}
然后项目中所有的Activity都继承自BaseActivity;
这样每当进入一个Activity就会在LogCat中打印活动的类名信息了。
二、随时随地退出应用:
如何做到无论打开多少页面都只要按一下Back键就能退出应用那?
专门建一个集合类来管理Activity就可以了。其中包含了3个静态的方法:添加、移除和结束所有Activity的方法。
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
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中的onCreate()和onDestroy()方法分别调用addActivity()和removeActivity()方法;
@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);
}
之后想要在那个Activity结束应用就可以在该Activity中调用ActivityCollector类的finishAll()方法就可以了。
三、启动活动的最佳写法:
如果启动一个Activity需要某些数据,为了方便他人启动这个Activity,可以在这个活动中添加一个actionStart()方法 来告诉他人需要哪些数据。
public static void actionStart(Context context,String data1,String data2,...){
Intent intent = new Intent(context, ThisActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
...
context.startActivity(intent);
}
这个方法中参数就是启动这个Activity所需要的数据,并且封装了启动这个Activity的代码。
他人要启动这个Activity只需要调用actionStart()就可以方便地启动了。
ThisActivity.actionStart(MainActivity.this,"data1","data2");