第2章 探究活动

本系列学习笔记第2章

前言

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

目录

1、活动是什么?

2、活动的基本知识点
    2.1 android:@+id 讲解
    2.1 android:@string 讲解
    2.3 配置主活动
    2.4 在活动中使用Menu
    2.5 使用显式Intent
    2.6 隐式Intent使用方式一:启动自己程序内的活动
    2.7 隐式Intent使用方式二:启动其它程序内的活动
    2.8 向下一个活动传递数据
    2.9 返回数据给上一个活动
    
3、活动的生命周期
    3.1 返回栈
    3.2 活动状态
    3.3 活动的生存期
    3.4 活动的生命周期
    3.5 活动被回收了怎么办?

4、活动的启动模式

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

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

7、ActionBar的使用
    7.1 设置主题
    7.2 创建菜单

8、ToolBar的使用
    8.1 去掉ActionBar的主题
    8.2 布局中定义ToolBar
    8.3 代码中使用ToolBar取代ActionBar
    8.4 ToolBar标题居中

9、NavigationView的使用

10、主题样式设置

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容