第九周安卓开发学习总结
Posted wushenjiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九周安卓开发学习总结相关的知识,希望对你有一定的参考价值。
写在前面
鸽了很久,在面临要冲刺的大关面前,终于拾了起来。前几周玩的太狠,都忘了正事了。下面开始正式学习。
这几天学习了Activity的相关内容。是安卓四大组件之一,可以说是最根本的东西了。
了解androidManifest.xml
这个文件的存在是为了描述我们的项目文件,我们四大组件都需要在清单文件里进行注册才能正常使用。如图:
application就是APP的全称,代表我们的整个app项目。我们可以在里面设置APP的图标,名字等等属性。
下面就是activity的注册声明了。里面包含了意图过滤,用来设置应用的启动入口等等
实现界面跳转
显式意图应用内Activity跳转
实现很简单,如下代码:
//显式启动的第一种写法
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
//显式启动的第二种写法
Intent intent1 = new Intent();
intent1.setClassName(MainActivity.this,"com.test.activitiyleanring.SecondActivity");
startActivity(intent1);
//显式启动的第三种写法
Intent intent = new Intent();
ComponentName componentName = new ComponentName(MainActivity.this,SecondActivity.class);
intent.setComponent(componentName);
startActivity(intent);
其实,一般情况下我们都这么写(最多的使用方式):
Intent intent = new Intent(this,SecondActivity.classs);
startActivity(intent);
隐式意图应用内Activity跳转
//隐式启动的第一种写法
Intent intent = new Intent("abcd.SecondActivity");
startActivity(intent);
//隐式启动的第二种写法
Intent intent = new Intent();
intent.setAction("abcd.SecondActivity");
startActivity(intent);
所谓的隐式意图,其实就是不明确点出我要去启动哪个activity,而从activity的目录读取。
显式意图和隐式意图的用途?
说了这么多,我也很疑惑,隐式意图这么麻烦,为什么要用他呢?其实是为了启动第三方应用(如调用手机相机等等。)
那么我们来看一下如何通过显式和隐式启动第三方应用:
显式意图启动第三方应用
/**
* 这个方法会在点击按钮的时候执行
*
* @param view 这个其实是我们点击的button
* <p>
* 其实组件的名称 ComponentName = 包名/类得路径名称,如果类和前面的包名一样就可以省略成.
* <p>
* 以下这种方式是显式意图跳转到浏览器界面
*/
public void skip2BrowserVisible(View view) {
Log.d(TAG, "skip2Browser");
Intent intent = new Intent();
//第一种写法
//intent.setClassName("com.android.chrome","com.android.browser.BrowserActivity");
//第二种写法
ComponentName componentName = new ComponentName("com.android.chrome", "com.android.browser.BrowserActivity");
intent.setComponent(componentName);
startActivity(intent);
}
可以看到,我们还要找到包名等等,十分麻烦。
那隐式启动呢?
隐式意图启动第三方应用
/**
* 下面我们通过隐式意图跳转到浏览器界面
* 步骤:
* 1.创建Intent对象
* 2.给Intent对象设置Action值,设置它的category值,如果5.1以上系统需要设置包名
* 3.startActivity来跳转到另外一个界面
*
* @param v
*/
public void skip2BrowserInvisible(View v) {
Intent intent = new Intent();
// <intent-filter>
// <action android:name="android.intent.action.SEARCH" />
// <category android:name="android.intent.category.DEFAULT" />
// </intent-filter>
intent.setAction("android.intent.action.SEARCH");
intent.addCategory("android.intent.category.DEFAULT");
intent.setPackage("com.android.browser");
startActivity(intent);
}
可以看到,隐式启动比较简单。这也是为什么隐式启动会常用于第三方应用的启动。
实现界面跳转传值
传值
先看代码:
private void initListener() {
mLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//这里面也就是登陆按钮被点击了
Log.d(TAG,"login被点击了");
handlerLogin();
}
});
}
private void handlerLogin() {
String accountText = mAccount.getText().toString().trim();
if (TextUtils.isEmpty(accountText)) {
Toast.makeText(this,"输入的账号为空!",Toast.LENGTH_SHORT).show();
return;
}
String passwordText = mPassword.getText().toString().trim();
if (TextUtils.isEmpty(passwordText)) {
Toast.makeText(this,"输入的密码为空!",Toast.LENGTH_SHORT).show();
return;
}
//有密码有账号以后,我们把数据传到另外一个界面
//先要创建一个意图对象,然后通过startActivity方法来跳转
/**
* 这部分是用于显式意图跳转到另外一个Activity
*/
//Intent intent = new Intent(this,SecondActivity.class);
Intent intent = new Intent();
String packageName = this.getPackageName();
String targetActivityClsName = SecondActivity.class.getName();
intent.setClassName(packageName,targetActivityClsName);
Log.d(TAG,"packageName "+packageName);
Log.d(TAG,"className "+ targetActivityClsName);
intent.putExtra("account",accountText);
intent.putExtra("password",passwordText);
startActivity(intent);
可以看到,我们用putExtra方法来放入值,然后我们再在第二个界面接收:
public class SecondActivity extends Activity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView info = this.findViewById(R.id.info);
Intent intent = getIntent();
String account = intent.getStringExtra("account");
String password = intent.getStringExtra("password");
Log.d(TAG,"account =="+account);
Log.d(TAG,"password =="+password);
info.setText("您的账号是:"+account+" 密码是:"+password);
}
}
同样的,对象等等也是可以传的,但要对用户类实现序列化才可(implements Parcelable),之后使用putExtra方法就可
回调
Intent intent = new Intent(MainActivity.this,PayActivity.class);
//第一步,使用startActivityForResult代替原来的startActivity
startActivityForResult(intent,PAY_REQUEST_CODE);
/**
* 返回的结果会在这里回调
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PAY_REQUEST_CODE) {
String resultContent = null;
if (resultCode == 2) {
//充值成功
resultContent = data.getStringExtra("resultContent");
}else if(resultCode ==3){
//充值失败
resultContent = data.getStringExtra("resultContent");
}
mPayResultText.setText(resultContent);
}
}
回调要麻烦一些,首先要使用startActivityForResult方法,然后再复写onActivityResult方法就可以取得回调的参数了
Activity的生命周期
之前也了解过,分别是onCreate onStart onResume onPause onStop onDestroy 生命周期按顺序走动。其中我们一般在onDestroy方法存储数据,然后在onCreate方法再复原出来。
横竖屏对Activity生命周期的影响
横竖屏会让Activity销毁再启动,就会使得开发时遇到一些困难,这时我们一可以固定住,二可以配置:
android:configChanges="keyboardHidden|screenSize|orientation"
以上是关于第九周安卓开发学习总结的主要内容,如果未能解决你的问题,请参考以下文章