Android service

1.創(chuàng)建一個(gè)簡單的服務(wù)

1.創(chuàng)建一個(gè)類采盒,繼承自service

public class SimpleService extends Service {

    public SimpleService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.v("myApp", "SimpleService onCreate");

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("myApp", "SimpleService onDestroy");
    }
}

2.在Manifest中只需要注冊service類就可以了

<service
            android:name=".SimpleService"
            android:enabled="true"
            android:exported="true" />

3.在activity中啟動或者停止服務(wù)

private void initButton1() {
        Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SimpleService.class);
                startService(intent);
            }
        });
    }

    private void initButton2() {
        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SimpleService.class);
                stopService(intent);
            }
        });
    }

2.服務(wù)和子線程的區(qū)別
1.線程是需要依賴app進(jìn)程而存在的歹袁,如果app進(jìn)程被殺死了伐债,那么線程的內(nèi)存也就被回收了宝恶,線程也會死
2.服務(wù)咋愛殺死app的時(shí)候也會被殺死涕俗,但是之后會重新啟動

1.現(xiàn)象:同樣應(yīng)用程序被關(guān)閉了 線程同時(shí)被殺死 如果是服務(wù)(先被殺死 然后重新啟動)
2.本質(zhì):服務(wù)是一個(gè)安卓組件 (先被殺死 然后重新啟動):
系統(tǒng)認(rèn)為服務(wù)之所以被殺死 是因?yàn)楫?dāng)前應(yīng)用的進(jìn)程被殺死 可能是因?yàn)閮?nèi)存不足而造成 它會重新啟動服務(wù)

public class MainActivity extends AppCompatActivity {

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


        new Thread(){
            @Override
            public void run() {
                super.run();

                while (true) {
                    SystemClock.sleep(3000);
                    Log.v("myApp", "線程還在運(yùn)行中...");
                }
            }
        }.start();
}
public class SimpleService extends Service {
    int i = 0;

    public SimpleService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();


        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {

                i = i + 1;
                Log.v("myApp", "服務(wù)還在進(jìn)行著...." + i);

            }
        }, 2000, 3000);

    }
}

3.接收開機(jī)廣播,開啟監(jiān)聽手機(jī)服務(wù)

1.注冊接收系統(tǒng)開機(jī)廣播的接收者

<receiver
            android:name=".BootReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

2.接收到廣播的時(shí)候端姚,開啟監(jiān)聽服務(wù)

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        
        Intent serviceIntent = new Intent(context, CallService.class);
        context.startService(serviceIntent);
    }
}

3.服務(wù)開始監(jiān)聽手機(jī)通話并錄音

public class CallService extends Service {

    private MediaRecorder mRecorder;


    public CallService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.v("myApp", "開機(jī)啟動監(jiān)聽服務(wù)");


        final TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        manager.listen(new PhoneStateListener() {

            private String mIncomingNumber="";
            private boolean mIsRecording;

            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);

                switch (manager.getCallState()) {
                    case TelephonyManager.CALL_STATE_IDLE:
                        Log.v("myApp", "休閑(沒有電話)/掛斷:" + incomingNumber);
                        if (mRecorder!=null&&mIsRecording) {
                            mRecorder.stop();
                            mRecorder.release();
                            mRecorder = null;
                            mIsRecording=false;
                        }
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        Log.v("myApp", "接通 :" + incomingNumber);
                        //MediaRecorder 錄音
                        mRecorder = new MediaRecorder();
                        //設(shè)置音頻的來源     MIC DEFAULT開發(fā)的時(shí)候
                        //真實(shí)打電話  VOICE_DOWNLINK/VOICE_UPLINK
                        //VOICE_CALL既能聽到自己的聲音 也能聽到別人的聲音
                        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                        //錄音之后要形成一個(gè)音頻文件 音頻的后綴是   .3gp   .mp3  .mp4
                        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                        //設(shè)置錄音的文件保存到什么地方
                        mRecorder.setOutputFile(getRecordFilePath(mIncomingNumber));
                        //設(shè)置音頻內(nèi)部解碼
                        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                        try {
                            mRecorder.prepare();
                        } catch (IOException e) {

                        }
                        mRecorder.start();
                        mIsRecording=true;
                        break;
                    case TelephonyManager.CALL_STATE_RINGING:
                        Log.v("myApp", "來電:" + incomingNumber);
                        mIncomingNumber=incomingNumber;
                        break;
                }
            }
        }, 1);
    }

    /**
     * 獲取文件的路徑
     */
    private String getRecordFilePath(String phone){
        //文件名的格式    電話號碼+"#"時(shí)間+".3gp"
        SimpleDateFormat formatter=new SimpleDateFormat("yy-MM-dd hh:mm");
        String fileName=phone+"#"+formatter.format(new Date())+".3gp";
        File file=new File(getFilesDir(),fileName);
        return file.getAbsolutePath();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

4.動態(tài)注冊廣播接收者浓体,監(jiān)聽開屏和鎖屏

動態(tài)注冊鎖屏開屏的廣播接收者

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ScreenReceiver screenReceiver = new ScreenReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        intentFilter.addAction(Intent.ACTION_USER_PRESENT);

        registerReceiver(screenReceiver, intentFilter);
    }
}

public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        Log.v("myApp", "000");

        if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
            Log.v("myApp", "開屏");
        } else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){
            Log.v("myApp", "鎖屏");
        }
    }
}

5.進(jìn)程等級
Android系統(tǒng)會盡量的長期保存每一個(gè)進(jìn)程不被回收。

  • 這樣 第二次開啟界面后就會發(fā)現(xiàn)啟動速度比以前快了 這是因?yàn)橄到y(tǒng)已經(jīng)創(chuàng)建了一個(gè)進(jìn)程 沒有被殺死 這次啟動就不用再重新創(chuàng)建泣刹。
  • 但是 當(dāng)內(nèi)存不足的時(shí)候 系統(tǒng)就要?dú)⒌粢恍├系倪M(jìn)程 就要考慮殺進(jìn)程的策略了助析。

系統(tǒng)定義了進(jìn)程的優(yōu)先級
1.Foreground progress 前臺進(jìn)程
用戶在操作的應(yīng)用程序所在的進(jìn)程是前臺進(jìn)程
2.Visible progress 可見進(jìn)程
用戶仍然可以看到界面 但是里面的按鈕點(diǎn)擊不了了
3.Service progress 服務(wù)進(jìn)程
進(jìn)程里面有一個(gè)服務(wù)處于運(yùn)行的狀態(tài)
4.Background progress 后臺進(jìn)程
如果一個(gè)應(yīng)用程序沒有服務(wù)處于運(yùn)行狀態(tài) 界面最小化
5.Empty progress 空進(jìn)程
應(yīng)用程序沒有任何活動的組件(界面或者服務(wù))

6.使用綁定服務(wù)的方式和service進(jìn)行通信
原因:因?yàn)樵赼ctivity中啟動服務(wù)時(shí),是系統(tǒng)利用反射的方式將service實(shí)例化之后啟動的椅您,所以如果在activity中需要和service進(jìn)行交互外冀,那么是得不到service的實(shí)例的。這樣的情況下就有了onBindService綁定服務(wù)掀泳。綁定服務(wù)會在service中創(chuàng)建一個(gè)類似管家是內(nèi)部類在activity綁定service的時(shí)候雪隧,返回給activity使用,用來和service進(jìn)行通訊员舵。

public class MainActivity extends AppCompatActivity {

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

        initButtonStartService();
        initButtonConnService();
    }


    private void initButtonStartService() {
        Button button = (Button) findViewById(R.id.button_startService);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(MainActivity.this, MyService.class);
                bindService(intent, new ServiceConnection() {

                    // 綁定成功之后脑沿,回調(diào)的方法
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
                        myBinder = (MyService.MyBinder) service;
                    }

                    // 解綁成功之后,回調(diào)的方法
                    @Override
                    public void onServiceDisconnected(ComponentName name) {

                    }
                }, BIND_AUTO_CREATE);
            }
        });
    }

    private void initButtonConnService() {
        Button button = (Button) findViewById(R.id.button_connService);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myBinder.showToast();
            }
        });
    }
}
public class MyService extends Service {
    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.v("myApp", "服務(wù)創(chuàng)建");
    }

    // 服務(wù)開啟
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("myApp", "服務(wù)開始");

        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("myApp", "服務(wù)銷毀");

    }


    // 進(jìn)行外部通訊的內(nèi)部類
    public class MyBinder extends Binder{
        public void showToast(){

            // 這里可以調(diào)用服務(wù)的方法马僻,實(shí)現(xiàn)和服務(wù)的交互和通訊
            MyService.this.showToast();
        }
    }

    // 服務(wù)綁定
    @Override
    public IBinder onBind(Intent intent) {

        Log.v("myApp", "服務(wù)綁定");

        return new MyBinder();
    }


    private void showToast() {

        Toast.makeText(MyService.this, "調(diào)用了服務(wù)里的方法", Toast.LENGTH_SHORT).show();
    }
}

使用代理來進(jìn)行限制
上面這樣寫其實(shí)是不規(guī)范的捅伤,因?yàn)镸yBinder這個(gè)類中還可以偷偷實(shí)現(xiàn)其他的方法供外部調(diào)用,而無法規(guī)范MyBinder的行為巫玻,這種情況下就需要使用到接口來限制MyBinder的權(quán)限丛忆,讓外部的activity不能隨意調(diào)用MyBinder中的方法。
這樣將MyBinder這個(gè)內(nèi)部類私有化仍秤,讓外部調(diào)用時(shí)只能通過接口來調(diào)用方法熄诡,起到了對外部的限制

public class MainActivity extends AppCompatActivity {

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

        initButtonStartService();
        initButtonConnService();
    }


    private void initButtonStartService() {
        Button button = (Button) findViewById(R.id.button_startService);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.v("myApp", "點(diǎn)擊開始綁定按鈕");

                Intent intent = new Intent(MainActivity.this, MyService.class);
                bindService(intent, new ServiceConnection() {

                    // 綁定成功之后,回調(diào)的方法
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
                        myBinder = (IMyService) service;
                    }

                    // 解綁成功之后诗力,回調(diào)的方法
                    @Override
                    public void onServiceDisconnected(ComponentName name) {

                    }
                }, BIND_AUTO_CREATE);
            }
        });
    }

    private void initButtonConnService() {
        Button button = (Button) findViewById(R.id.button_connService);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myBinder.callShowToast();
            }
        });
    }
}
// 用來限制MyService中MyBinder的協(xié)議
public interface IMyService {
    void callShowToast();
}

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.v("myApp", "服務(wù)創(chuàng)建");
    }

    // 服務(wù)開啟
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("myApp", "服務(wù)開始");

        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("myApp", "服務(wù)銷毀");

    }


    // 進(jìn)行外部通訊的內(nèi)部類
    private class MyBinder extends Binder implements IMyService {

        @Override
        public void callShowToast() {
            // 這里可以調(diào)用服務(wù)的方法凰浮,實(shí)現(xiàn)和服務(wù)的交互和通訊
            MyService.this.showToast();
        }
    }

    // 服務(wù)綁定
    @Override
    public IBinder onBind(Intent intent) {

        Log.v("myApp", "服務(wù)綁定");

        return new MyBinder();
    }


    private void showToast() {

        Toast.makeText(MyService.this, "調(diào)用了服務(wù)里的方法", Toast.LENGTH_SHORT).show();
    }
}

7.service的生命周期

public class MyService extends Service {
    
    @Override
    public void onCreate() {
        super.onCreate();
        Log.v("myApp", "MyService onCreate在服務(wù)創(chuàng)建的時(shí)候調(diào)用");
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("myApp", "MyService onStartCommand在服務(wù)開啟的時(shí)候調(diào)用");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("myApp", "MyService onDestroy在服務(wù)銷毀的時(shí)候調(diào)用");
    }

    @Override
    public boolean onUnbind(Intent intent) {

        Log.v("myApp", "服務(wù)解綁");

        return super.onUnbind(intent);
    }
}

生命周期方法就這幾個(gè),但是在startService和bindService這兩種模式下苇本,調(diào)用的方法還是不一樣的
在startService時(shí)袜茧,調(diào)用的是onCreate,onStartCommand瓣窄,onDestroy
在bindService時(shí)笛厦,調(diào)用的是onCreate,onBind俺夕,onUnbind裳凸,onDestroy

服務(wù)有兩個(gè)特性,
1.后臺一直運(yùn)行 2.沒有界面劝贸,能夠與界面交互
startService:后臺一直運(yùn)行姨谷,但是不能與界面交互
bindService:當(dāng)啟動服務(wù)的組件被銷毀時(shí),服務(wù)也跟著銷毀映九,能夠與界面交互
所以在項(xiàng)目中梦湘,我們會將兩種方式一起使用,先startService來啟動服務(wù)件甥,這種啟動方式下只要不是stopService捌议,service是不會停止的,然后使用bindService來綁定服務(wù)嚼蚀,實(shí)現(xiàn)service與界面的交互禁灼,當(dāng)不需要交互時(shí)可以調(diào)用unBindService來解除綁定,但是服務(wù)還是存活的轿曙,如果連service都不需要了弄捕,那么調(diào)用stopService,服務(wù)就會被銷毀了

8.遠(yuǎn)程服務(wù)創(chuàng)建和aidl使用
舉例:淘寶下單导帝,調(diào)用支付寶的支付功能

1.創(chuàng)建支付service并且注冊對應(yīng)的action守谓,淘寶啟動service的時(shí)候需要根據(jù)action android:name來進(jìn)行過濾

      <service
            android:name=".AlipayService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.mazhan.alipay.action.SAFEPAY"/>
            </intent-filter>
        </service>
public class AlipayService extends Service {
    public AlipayService() {
    }


    @Override
    public IBinder onBind(Intent intent) {
        return new MyAlipayAgent();
    }


    int callSafePay(String account, String pwd, String payPwd, double price) {
        if (!payPwd.equals("123")) {
            return 2;
        }
        if (price > 1000) {
            return 3;
        }
        return 1;
    }

    class MyAlipayAgent extends IAlipayService.Stub {

        @Override
        public int callSafePay(String account, String pwd, String payPwd, double price) throws RemoteException {
            return AlipayService.this.callSafePay(account, pwd, payPwd, price);
        }
    }

}

這里在本地調(diào)用的時(shí)候MyAlipayAgent繼承的是Binder并且實(shí)現(xiàn)IAlipayService接口,這里使用的是aidl文件您单,創(chuàng)建IAlipayService的aidl文件斋荞,然后 build->clean project,就會自動生成IAlipayService.java文件虐秦,在其中有一個(gè)內(nèi)部類Stub已經(jīng)繼承了android.os.Binder 并且實(shí)現(xiàn)了com.mazhan.alipayservice接口平酿,所以我們的代理MyAlipayAgent 只需要繼承IAlipayService.Stub就可以了

public static abstract class Stub extends android.os.Binder implements com.mazhan.alipayservice.IAlipayService

IAlipayService的aidl文件

package com.mazhan.alipayservice;
interface IAlipayService {

    /*
    * 返回值:1凤优,支付成功,2蜈彼,賬號錯(cuò)誤或密碼錯(cuò)誤筑辨,3,余額不足
    *
    * */
    int callSafePay(String account, String pwd, String payPwd, double price);
}

*在淘寶項(xiàng)目中幸逆,下單時(shí)調(diào)用IAlipayService 接口棍辕,那么就需要將IAlipayService.aidl文件拷貝到淘寶項(xiàng)目中,然后生成IAlipayService.java还绘,這樣就可以調(diào)用IAlipayService 接口中的方法了

public class MainActivity extends AppCompatActivity {

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


        Button button = (Button) findViewById(R.id.button_pay);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent();
                intent.setAction("com.mazhan.alipay.action.SAFEPAY");
                intent.setPackage("com.mazhan.alipayservice");
                startService(intent);


                bindService(intent, new ServiceConnection() {
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
                        
                        IAlipayService iAlipayService = IAlipayService.Stub.asInterface(service);
                        
                        try {
                            int i = iAlipayService.callSafePay("zhangsan", "123", "123", 100);
                            
                            switch (i) {
                                case 1 :
                                    Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                                    break;
                                case 2 :
                                    Toast.makeText(MainActivity.this, "支付密碼錯(cuò)誤", Toast.LENGTH_SHORT).show();

                                    break;
                                case 3 :
                                    Toast.makeText(MainActivity.this, "余額不足", Toast.LENGTH_SHORT).show();

                                    break;
                                default:
                                    break;

                            }
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onServiceDisconnected(ComponentName name) {

                    }
                }, BIND_AUTO_CREATE);
            }
        });
    }
}

注意點(diǎn)

1.在淘寶項(xiàng)目中復(fù)制aidl文件時(shí)楚昭,需要連包名一起復(fù)制


image.png

2.在淘寶的mainActivity中,啟動支付寶的service時(shí)拍顷,在安卓5.0之后隱式啟動時(shí)抚太,需要設(shè)置包名


3.在IAlipayService.Stub中提供了將IBinder轉(zhuǎn)換為IAlipayService的方法

 IAlipayService iAlipayService = IAlipayService.Stub.asInterface(service);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菇怀,隨后出現(xiàn)的幾起案子凭舶,更是在濱河造成了極大的恐慌,老刑警劉巖爱沟,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帅霜,死亡現(xiàn)場離奇詭異,居然都是意外死亡呼伸,警方通過查閱死者的電腦和手機(jī)身冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來括享,“玉大人搂根,你說我怎么就攤上這事×逑剑” “怎么了剩愧?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娇斩。 經(jīng)常有香客問我仁卷,道長,這世上最難降的妖魔是什么犬第? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任锦积,我火速辦了婚禮,結(jié)果婚禮上歉嗓,老公的妹妹穿的比我還像新娘丰介。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布哮幢。 她就那樣靜靜地躺著带膀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橙垢。 梳的紋絲不亂的頭發(fā)上本砰,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音钢悲,去河邊找鬼。 笑死舔株,一個(gè)胖子當(dāng)著我的面吹牛莺琳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播载慈,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼惭等,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了办铡?” 一聲冷哼從身側(cè)響起辞做,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寡具,沒想到半個(gè)月后秤茅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡童叠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年框喳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厦坛。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡五垮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杜秸,到底是詐尸還是另有隱情放仗,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布撬碟,位于F島的核電站诞挨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏小作。R本人自食惡果不足惜亭姥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顾稀。 院中可真熱鬧达罗,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扶认,卻和暖如春侨拦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辐宾。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工狱从, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叠纹。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓季研,卻偏偏與公主長得像,于是被迫代替她去往敵國和親誉察。 傳聞我的和親對象是個(gè)殘疾皇子与涡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356