android基础知识学习笔记我爱编程

第2章 探究活动

2018-04-14  本文已影响14人  追梦小乐

本系列学习笔记第2章

前言

打算把android基本知识点写一个系列,旨在把android基础书,例如《Android 第一行代码 第2版》、《爱上android》、《疯狂android讲义》等书的一些知识点记录一下,会持续更新内容,为了方便自己复习,也希望可以帮助到大家!

1、活动是什么?

活动(Activity),它是一种可以包含用户界面的组件,主要用于和用户进行交互,一个应用程序中可以包含零个或多个活动,拥有零个活动的程序一般用来作为第三方服务提供其它应用在内部进行调用的,例如支付宝快捷支付服务。

2、活动的基本知识点

2.1 android:@+id 讲解

android:@+id 是给当前的元素定义一个唯一标识符,之后可以用这个在代码中对这个元素进行操作。

2.1 android:@string 讲解

android:@string 对资源进行引用方式

2.3 配置主活动
image.png
2.4 在活动中使用Menu
image.png
image.png
image.png
image.png

main.xml 文件的内容

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/add_item"
        android:title="Add"
        />

    <item
        android:id="@+id/remove_item"
        android:title="Remove"
        />
</menu>

在主活动中的应用

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }
}
2.5 使用显式Intent
   Intent i = new Intent(MainActivity.this,SecondActivity.class);
        //参数1:参数Context 要求提供一个启动活动的上下文
        //参数2:参数Class 则是指定想要启动的目标活动
        startActivity(i);
2.6 隐式Intent使用方式一:启动自己程序内的活动
  <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.administrator.androidstudydemo.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.example.administrator.androidstudydemo.MY_CATEGORY"/>
            </intent-filter>
        </activity>
 //只有<action>  和 <category> 同时匹配Intent中的action 和 category时,这个活动才能响应该Intent
        Intent intent = new Intent("com.example.administrator.androidstudydemo.ACTION_START");
        intent.addCategory("com.example.administrator.androidstudydemo.MY_CATEGORY");
        startActivity(intent);
        //通过startActivity(intent);默认将默认的category添加到intent中
2.7 隐式Intent使用方式二:启动其它程序内的活动

data 的知识点讲解

<intent-filter>
         
                <data android:scheme="用于指定数据的鞋业部分,如http"
                      android:host="用于指定数据的主机名部分,如www.baidu.com"
                      android:port="用于指定数据的端口部分,一般紧随在主机名之后"
                      android:path="用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容"
                      android:mimeType="用于指定可以处理的数据类型,允许使用通配符的方式进行指定"
                    />
            </intent-filter>
        //启动系统浏览器
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
        //调用系统拨号界面
        Intent i = new Intent(Intent.ACTION_DIAL);
        i.setData(Uri.parse("tel:10086"));
        startActivity(i);
    private void share(){
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_SEND);
        //指定参数类型
        intent.setType("text/plain");  //"image/png"
        //设置要分享的文本
        intent.putExtra(Intent.EXTRA_TEXT,"奔跑吧,兄弟");
        startActivity(intent);
    }
2.8 向下一个活动传递数据
        //第一个活动
        Intent intent = new Intent(MainActivity.this,SecondActivity.class);
        intent.putExtra("定义的key","传递的数据");
        startActivity(intent);
        //第二个活动
        Intent intent = getIntent();

        //例如
        String data = intent.getStringExtra("第一个活动中定义的key");
2.9 返回数据给上一个活动
public class MainActivity extends AppCompatActivity {

    private static final int mRequestCode = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.btn_intent);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivityForResult(intent,mRequestCode);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case mRequestCode:
                if (resultCode == RESULT_OK){
                    String returnData = data.getStringExtra("data_return");
                }
                break;
        }
    }
}
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        //通过按钮方法把数据返回给上一个活动
        Button button = (Button) findViewById(R.id.btn_result);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("data_return","Hello FirstActivity");
                setResult(RESULT_OK,intent);
                finish();
            }
        });

    }


    //通过按返回键的方式把数据返回给上一个活动
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = new Intent();
        intent.putExtra("data_return","Hello FirstActivity");
        setResult(RESULT_OK,intent);
        finish();
    }
}

3、活动的生命周期

3.1 返回栈

Android中的活动是可以层叠的,每启动一个新的活动,就会覆盖在原活动之上,然后点击Back键会销毁最上面的活动,下面的一个活动就会重新显示出来。

Android是使用任务来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈,是一个后进先出的数据结构。

3.2 活动状态

1)运行状态:一个活动位于返回栈的栈顶

2)暂停状态:不在处于栈顶的位置,但是仍然可见

3)停止状态:不在处于栈顶的位置,并且完全不可见

4)销毁状态:从返回栈中移除后

3.3 活动的生存期

活动的7个回调方法,除了onRestart()方法,分成了3种生存期

1)完成生存期:onCreate()方法 和 onDestroy()方法之间所经历的

2)可见生存期:onStart()方法 和 onStop()方法之间所经历的

3)前台生存期:onResume()方法 和 onPause()方法之间所经历的

3.4 活动的生命周期
image.png

MainActivity ---> SecondActivity ---> 返回键 会触发的生命周期


image.png image.png

MainActivity ---> DialogActivity ---> 返回键 会触发的生命周期

        <activity android:name=".DialogActivity"
            android:theme="@style/Theme.AppCompat.Dialog"
            ></activity>
image.png image.png
3.5 活动被回收了怎么办?

当一个活动进入了停止状态,是有可能被系统回收的。

想象一个应用场景:应用中有一个活动A,用户在活动A的基础上启动了活动B,活动A进入了停止状态,这个时候由于系统内存不足,将活动A回收掉了,然后按下Back键返回活动A,会出现什么情况?

其实还是会显示活动A,不过不会走活动A的onRestart()方法,会重新走活动A的生命周期方法。

保存数据

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String tempData = "临时数据";
        outState.putString("data_key",tempData);
    }

取出保存数据

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState != null){
            String data = savedInstanceState.getString("data_key");

        }
    }

4、 活动的启动模式

  1. standard


    image.png
  2. singleTop


    image.png
  1. singleTask


    image.png
  1. singleInstance
image.png

5、 知晓当前是哪一个活动以及随时随地退出程序

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);
    }

    public static void finishAllActivity(){
        for (Activity activity : activities) {
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}

/**
 * 所有活动继承BaseActivity
 * Created by Administrator on 2018/4/14.
 */


public class BaseActivity extends AppCompatActivity {

    private static final String TAG = BaseActivity.class.getSimpleName();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,getClass().getSimpleName());
    }
}

6、 启动活动的最佳参考写法

        Intent intent = new Intent(context,toClass);
        intent.putExtra("param1",data1);
        intent.putExtra("param2",data2);
        context.startActivity(intent);
    }

7、 ActionBar的使用

image.png
image.png
7.1 设置主题
image.png image.png
7.2 创建菜单
image.png
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context=".section6.AppBarActivity">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never"/>

    <item
        android:id="@+id/action_1"
        android:orderInCategory="100"
        android:title="按钮1"
        android:icon="@mipmap/ic_launcher"
        app:showAsAction="ifRoom|withText"/>
    <item
        android:id="@+id/action_2"
        android:orderInCategory="100"
        android:title="按钮2"
        android:icon="@mipmap/ic_launcher"
        app:showAsAction="always"/>
</menu>

android:title="" 菜单标题

android:icon="" 菜单图标

showAsAction 表示显示的位置,可以有如下的值:
1) never表示不显示外层,
2) always永远显示在外面,
3) ifRoom表示空间允许显示出来,
4) withText 显示图标的时候同时显示菜单标题

orderInCategory 显示优先级,值越大优先级越低

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("ActionBar");
        actionBar.setSubtitle("我是小标题");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_app_bar,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId){
            case R.id.action_settings:
                break;
            case R.id.action_1:
                break;
            case R.id.action_2:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

image.png

8、 ToolBar的使用

ToolBar是为了取代ActionBar而出现的,因为ActionBar的局限性太大,不够灵活

8.1 去掉ActionBar的主题
image.png
8.2 布局中定义ToolBar
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.actionbardemo.MainActivity">


    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        >

    </android.support.v7.widget.Toolbar>

</LinearLayout>
8.3 代码中使用ToolBar取代ActionBar
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setLogo(R.mipmap.ic_launcher);
        toolbar.setNavigationIcon(R.mipmap.back);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        toolbar.setTitle("Toolbar");
        toolbar.setTitleTextColor(Color.WHITE);
        toolbar.setSubtitle("我是小标题");

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_app_bar,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId){
            case R.id.action_settings:
                break;
            case R.id.action_1:
                break;
            case R.id.action_2:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

image.png
8.4 ToolBar标题居中
image.png
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.actionbardemo.MainActivity">


    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorAccent"
        >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text="标题"
            android:gravity="center"
            android:layout_gravity="center"
            android:textColor="@color/colorPrimaryDark"
            />

    </android.support.v7.widget.Toolbar>

</LinearLayout>
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("");
        toolbar.setNavigationIcon(R.mipmap.back);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

        //这句话最好写在Toolbar的各种操作之后
        setSupportActionBar(toolbar);
    }

}

9、 NavigationView的使用

app_bar_main2.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.actionbardemo.Main2Activity"
    tools:showIn="@layout/app_bar_main2">

</android.support.constraint.ConstraintLayout>

app_bar_main2.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.actionbardemo.Main2Activity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main2" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

activity_main2.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main2"
        app:menu="@menu/activity_main2_drawer" />

</android.support.v4.widget.DrawerLayout>

Main2Activity.java文件

public class Main2Activity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main2, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}
image.png
image.png

9、 主题样式设置

image.png image.png image.png
image.png
image.png image.png
image.png image.png
image.png image.png
上一篇 下一篇

猜你喜欢

热点阅读