学习android也有一段时间,回顾总结一下;
创建Activity
在创建项目的时候,Android Studio默认会让创建一个活动,先选择一个Activity模板,之后的创建过程跟手动的过程一样,这里选择Add No Activity创建一个空项目,以手动的方式添加一个活动;打开目录app/src/main/java/packagename,此时应该是空的,我们右键点击包,new->Activity->Empty Activity,会弹出创建活动的对话框,命名为FirstActivity,此时有三个选项,Generate LayoutFile(自动创建布局)、Launcher Activity(设置为项目主活动)、Backwarks compatibility(项目启用向下兼容模式),只勾选Backwarks compatibility,布局以及设置主活动之后手动进行,点击Finish完成创建。
Android Studio自动创建了如下代码,任何Activity都应该重写onCreate,代码只是调用父类的onCreate方法,之后要加入我们自己的很多逻辑。
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
现在来创建加载布局,在app/src/main/res目录右键,new->Directory,会弹出一个新建目录的窗口,创建一个名为layout的目录,然后右键点击layout目录,选择Layout resource file,之后会弹出新建布局的窗口,命名为first_layout,点击ok完成新建。修改first_layout的内容,添加一个Button。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="button 1" /> </LinearLayout>
修改FirstActivity的代码,使用setContentView方法加载布局,如下所示:
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); } }
所有活动都要在AndroidManifest.xml中注册,打开app/main/AndroidManifest.xml,在Application中已经有FirstActivity的注册了,Android Studio在创建活动的时候帮我们注册了,在<application>标签中使用<activity>标签注册活动,android:name指定具体注册哪一个活动,最后还要配置项目的主活动,项目才能跑起来,在<activity>标签中加入<intent-filter>标签声明action category即可,如下所示:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
至此活动可以顺利启动了。
在活动中使用Toast,代码如下:
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); Button btn = (Button)findViewById(R.id.button_1) ; btn.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Toast.makeText(FirstActivity.this,"hello",Toast.LENGTH_SHORT).show(); } }); } }
调用finish()方法可以销毁活动。
使用Intent在活动中穿梭
创建另一个活动SecondActivity,使用自动生成布局文件,Intent是android各组件之间进行交互的重要方式,分为显式Intent和隐式Intent,修改FirstActvity的代码,传入FirstActivity.this作为上下文,传入SecondActivity.class作为启动目标,意图明显,为显示Intent,代码如下:
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); Button btn = (Button)findViewById(R.id.button_1) ; btn.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); } }); } }
隐式Intent通过指定一系列更为抽象的action、category信息,交由系统分析这个Intent,找出合适的活动启动,修改AndroidManifest.xml,为活动SecondActivity配置action、category,action只能配置一个,category可以配置多个,之后修改FirstActivity,代码如下:
<activity android:name=".SecondActivity" android:label="This is SecondActivity"> <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.example.activitytest.MY_CATEGORY" /> </intent-filter> </activity>
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); Button btn = (Button)findViewById(R.id.button_1) ; btn.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent("com.example.yujj.activitytest.ACTION_START"); //intent.addCategory("com.example.activitytest.MY_CATEGORY"); startActivity(intent); } }); } }
隐式Intent的更多应用
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086"));
传递数据
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); intent.putExtra("extra_data","hello world"); startActivity(intent);
接收数据
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
返回数据给上一个活动
FirstActivity: Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivityForResult(intent,1); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if(resultCode == RESULT_OK) { String returndata = data.getStringExtra("data_return"); Log.d(TAG, returndata); } break; default: } } SecondActivity: Button btn = (Button)findViewById(R.id.button_2); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("data_return","hello FirstActivity"); setResult(RESULT_OK,intent); finish(); } });