Android System Manager API

  • ActivityTaskManager:实现应用进程和运行在系统进程的 ActivityTaskManagerService 的通信;
  • ActivityTaskManagerService:负责管理activity
    获取IActivityTaskManager对象
public static IActivityTaskManager getService() {
    return IActivityTaskManagerSingleton.get();
}

IActivityTaskManager 其实是一个 Binder 对象,负责应用和 ActivityTaskManagerService 直接的通信。它有以下方法:

//为特定的任务设置窗口模式
setTaskWindowingMode()

//屏幕固定与取消
startSystemLockTaskMode()
stopSystemLockTaskMode()

//将指定taskId的task移到指定stackId的栈:
moveTaskToStack()

//将栈顶Activity移到指定stackId的栈:
moveTopActivityToPinnedStack()

//将Task移动分屏栈
setTaskWindowingModeSplitScreenPrimary()

//从指定windowingMode的窗口模式的中移除ActivityType为STANDARD或UNDEFINED类型的栈
removeStacksInWindowingModes()

//根据ActivityTypes移除栈
removeStacksWithActivityTypes()

//获取最近Task的最大数量
getMaxRecentTasksStatic()

//获取应用最近Task的最大数量限制
getMaxAppRecentsLimitStatic()

//获取默认最近Task的最大数量限制
getDefaultAppRecentsLimitStatic()

//如果系统至少支持一种形式的多窗口,则返回true。例如自由格式、分屏、画中画。
supportsMultiWindow()

//如果系统支持分屏多窗口,则返回true
supportsSplitScreenMultiWindow()

//列出所有activity的栈信息
listAllStacks()

//移除所有可见最近Task
removeAllVisibleRecentTasks()

//清除给定包的启动参数
clearLaunchParamsForPackages()

//将指定displayId的Task显示为Instance
setDisplayToSingleTaskInstance()

//调整栈的大小:
resizeStack()
resizeDockedStack()

//调整Task大小:
resizeTask()
  • InputManager:Input设备和Key布局状态信息管理
val inputManager = getSystemService(Context.INPUT_SERVICE) as InputManager
//获取Input设备ID
inputManager.inputDeviceIds
//根据ID获取Input设备
inputManager.getInputDevice()
val listener =object :InputManager.InputDeviceListener{
        override fun onInputDeviceAdded(deviceId: Int) {
        }

        override fun onInputDeviceRemoved(deviceId: Int) {
        }

        override fun onInputDeviceChanged(deviceId: Int) {
        }
}
//注册Input设备状态监听
inputManager.registerInputDeviceListener(listener, Handler())
//取消注册Input设备状态监听
inputManager.unregisterInputDeviceListener(listener)
  • RecoverySystem:包含与Android Recovery交互的方法(安装系统更新,删除用户数据,等等)
//验证系统更新包的密码签名
verifyPackage()

//验证InputStream的兼容性信息
verifyPackageCompatibility(InputStream)

//验证系统更新包的兼容性信息
verifyPackageCompatibility(File)

//使用uncrypt处理给定的包
processPackage()

//重启到Recovery以安装给定的更新包
installPackage()

//安排在下一次引导时安装给定的包
scheduleUpdateOnBoot()

//通过清除BCB(引导加载程序控制块)取消任何预定的更新
cancelScheduledUpdate()

//重启到Recovery以擦除用户数据和缓存分区
rebootWipeUserData()

//重启到Recovery以擦除缓存分区
rebootWipeCache()

//重启到Recovery以擦除A/B设备。
rebootWipeAb()

//返回清除Euicc数据是否成功
wipeEuiccData()

//利用RecoverySystemService通过Binder设置BCB命令并重启到相应的Recovery
rebootRecoveryWithCommand()

//使用提供的参数重新引导到Recovery
bootCommand()
  • AccountManager:将自己的帐号体系注册到系统服务
    针对于注册帐号的authenticator app,需了解以下接口:
/**
将一个帐号直接存储到AccountManager
*/
public boolean addAccountExplicitly(Account account, String password, Bundle userdata) 
/**
获取account的password(不一定是真实的用户密码,看authenticator app的存储)
*/
public String getPassword(final Account account);
/**
重置该account的password
注意:调用这个方法会清除该账号所有authToken在AccountManager中的缓存
*/
public void setPassword(final Account account, final String password) ;
/**
清除account的password
注意: 调用这个方法会清除该账号的password及authToken在AccountManager中的缓存
*/
public void clearPassword(final Account account) ;
/**
将account对应key-value存储在AccountManager中
*/
public void setUserData(final Account account, final String key, final String value);
/**
获取和该帐号相关的对应key值的value
*/
public String getUserData(final Account account, final String key);
/**
从AccountManager中删除account,由authenticator app决定是否可以删除该帐号
注意:这个方法可以在主线程调用,但是返回的AccountManagerFuture不能在主线程中使用
*/
public AccountManagerFuture<Bundle> removeAccount(final Account account, final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler);
/**
直接从AccountManager数据库中删除account
*/
public boolean removeAccountExplicitly(Account account);

下面接口供需要使用帐号服务的apps调用:

/**
获取和该帐号相关的对应key值的value
备注:这个方法可在主线程调用
权限要求:和注册account的authenticator app签名一致
*/
public String getUserData(final Account account, final String key);
/**
获取当前注册到AccountManager中的所有authenticator app的属性(即在authenticator xml中定义的account属性,再加上authenticator app的包名)
备注:这个方法可在主线程调用
*/
public AuthenticatorDescription[] getAuthenticatorTypes();
/**
获取当前存储到AccountManager的所有帐号列表,和getAccountsByType(null)相同
备注:这个方法可在主线程调用
权限要求:需要GET_ACCOUNTS的权限(这个权限在android 6.0及以上是运行时权限,需要动态申请)
*/
public Account[] getAccounts() ;

public Account[] getAccountsByTypeForPackage(String type, String packageName) ;
/**
获取特定account type
备注:这个方法可在主线程调用
权限要求:需要GET_ACCOUNTS的权限(这个权限在android 6.0及以上是运行时权限,需要动态申请)
*/
public Account[] getAccountsByType(String type);

/**
删除存储AccountManager中此账号类型对应的authToken缓存,应用必须调用这个方法将缓存的authToken置为过期,否则getAuthToken获取到的一直是缓存的token
备注:这个方法可以在主线程中调用
*/
public void invalidateAuthToken(final String accountType, final String authToken) ;
/**
获取AccountManager缓存的某个账号对应authTokenType的authToken
如果缓存中没有对应authTokenType的token值,并不会重新生成,而是直接返回false
备注:这个方法可以在主线程中调用
权限要求:和注册account的authenticator app签名相同
*/
public String peekAuthToken(final Account account, final String authTokenType) ;
/**
将一个account对应autheTokenType的authToken缓存在AccountManager中
备注:这个方法可以在主线程中调用
权限要求:和注册account的authenticator app签名相同
*/
public void setAuthToken(Account account, final String authTokenType, final String authToken);
/**
同步获取account对应authTokenType的authToken
notifyAuthFailure,如果authenticator app返回出错,要不要弹通知提醒
备注:这个方法可以可能涉及到网络请求,不要在主线程调用
权限要求:和注册account的authenticator app签名相同
*/
public String blockingGetAuthToken(Account account, String authTokenType, boolean notifyAuthFailure);
/**
权限要求:和注册account的authenticator app签名相同
*/
public AccountManagerFuture<Bundle> getAuthToken(final Account account, final String authTokenType, final Bundle options, final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler);
/**
权限要求:和注册account的authenticator app签名相同
*/
public AccountManagerFuture<Bundle> getAuthToken(final Account account, final String authTokenType, final Bundle options, final boolean notifyAuthFailure, AccountManagerCallback<Bundle> callback, Handler handler);
/**
要求用户添加某个特定accountType的帐号,如没有则会引导注册(authenticator app自己的处理)
注意:调用这个接口会调起authenticator app帐号登录的页面。传的activity参数就是用来启动这个intent的:如果传的activity参数不为null,则AccountManager会自动帮你start 登录的intent,否则你自己调用future.getResult(),返回的结果中会有AccountManager#KEY_INTENT对应的帐号登录页面的intent
*/
public AccountManagerFuture<Bundle> addAccount(final String accountType, final String authTokenType, final String[] requiredFeatures, final Bundle addAccountOptions, final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler);
/**
认证用户的身份(一般是验证帐号的密码)
注意:验证的行为由authenticator app来定义,同addAccount会调起authenticator app认证的页面
*/
public AccountManagerFuture<Bundle> confirmCredentials(final Account account, final Bundle options, final Activity activity, final AccountManagerCallback<Bundle> callback, final Handler handler);

除了以上接口外,还有一些获取帐号属性等接口:

/**
获取当前注册到AccountManager中的所有authenticator app的属性(即在authenticator xml中定义的account属性,再加上authenticator app的包名)
备注:这个方法可在主线程调用
*/
public AuthenticatorDescription[] getAuthenticatorTypes();
  • AccessibilityManager:用于分发AccessibilityEvents事件并提供用于查询系统可访问运行状态的工具。当用户界面中一些明显的事件发生可访问性事件发生时可访问性事件将被生成,例如一个Activity 开始,一个View的焦点或者选择状态发生变化等。对处理可访问性事件感兴趣的各方可以通过实现和继承AccessibilityService类后注册可访问性服务。
//监听系统的可访问性状态
AccessibilityStateChangeListener
CaptioningManager
//监听系统的触摸探测状态
TouchExplorationStateChangeListener

//使用该标志去指示超时的Ui内容包含交互性控件
FLAG_CONTENT_CONTROLS

//使用此标志去指示超时的UI内容包含图标
FLAG_CONTENT_ICONS

//使用该标志去指示超时的UI内从包含文本
FLAG_CONTENT_TEXT

//注册一个AccessibilityRequestPreparer监听者
void addAccessibilityRequestPreparer(AccessibilityRequestPreparer preparer)

//注册一个AccessibilityStateChangeListener以更改系统的全局辅助性状态
boolean addAccessibilityStateChangeListener(AccessibilityStateChangeListener listener)

//注册一个AccessibilityStateChangeListener以更改系统的全局辅助性状态
void addAccessibilityStateChangeListener(AccessibilityStateChangeListener listener, Handler handler)

//注册一个TouchExplorationStateChangeListener以更改系统的全局触摸浏览状态
void addTouchExplorationStateChangeListener(TouchExplorationStateChangeListener listener, Handler handler)

//注册一个TouchExplorationStateChangeListener以更改系统的全局触摸浏览状态
boolean addTouchExplorationStateChangeListener(TouchExplorationStateChangeListener listener)

//返回给定反馈类型的已启用辅助功能的AccessibilityServiceInfos
List getEnabledAccessibilityServiceList(int feedbackTypeFlags)

//返回已安装了辅助性功能服务的AccessibilityServiceInfos
List getInstalledAccessibilityServiceList()

//获取建议的用户更改UI所需的超时时间
int getRecommendedTimeoutMillis(int originalTimeout, int uiContentFlags)

//对于所有的可访问性服务请求反馈中断
void interrupt()

//检测系统导航区域内是否支持辅助性按钮
static boolean isAccessibilityButtonSupported()

//返回系统是否开启了辅助性服务
boolean isEnabled()

返回系统是否开启了触摸探测
boolean isTouchExplorationEnabled()

//注销AccessibilityRequestPreparer
void removeAccessibilityRequestPreparer(AccessibilityRequestPreparer preparer)

//注销AccessibilityStateChangeListener
boolean removeAccessibilityStateChangeListener(AccessibilityStateChangeListener listener)

//注销TouchExplorationStateChangeListener
boolean removeTouchExplorationStateChangeListener(TouchExplorationStateChangeListener listener)

//发送一个 AccessibilityEvent
void sendAccessibilityEvent(AccessibilityEvent event)
  • CaptioningManager:包含访问和监控首选视频字幕状态和视觉属性的方法
//返回用户首选的字幕启用状态
public final boolean isEnabled()
//返回用户首选的当地语言字幕的字符串
public final String getRawLocale()
//返回用户首选的当地语言
public final Locale getLocale()
//返回用户首选的字幕字体缩放系数
public final float getFontScale()

//返回用户首选的可视属性CaptionStyle
public CaptionStyle getUserStyle()

//为用户首选的字幕启用状态和可视属性的更改添加侦听器
public void addCaptioningChangeListener(@NonNull CaptioningChangeListener listener)

//移除监听
public void removeCaptioningChangeListener(@NonNull CaptioningChangeListener listener)
  • SearchManager:查询系统内所有支持全局搜索功能的应用
  • SensorManager:访问设备的传感器
  • StorageManager:提供系统存储服务的接口,存储管理器处理与存储相关的项目,如OBBs。
  • StorageStatsManager:访问详细的存储统计信息
  • WallpaperManager:提供系统壁纸服务的接口,获取当前壁纸信息,设置壁纸等
//设置壁纸需要的权限
<uses-permission android:name="android.permission.SET_WALLPAPER"/> 

//将壁纸设置为bitmap所代表的位图
setBitmap(Bitmap bitmap)

//将壁纸设置为resid资源所代表的图片
setResource(int resid)

//将壁纸设置为data数据所代表的图片
setStream(InputStream data)

//清除壁纸,设置回系统默认的壁纸
clear()

//最小壁纸高度
getDesiredMinimumHeight()

//最小壁纸宽度
getDesiredMinimumWidth()

//获得当前系统壁纸,如果没有设置壁纸,则返回系统默认壁纸
getDrawable()

//加入当前壁纸是动态壁纸,返回动态壁纸信息
getWallpaperInfo()

//获得当前系统壁纸,如果没设置壁纸的话返回null
peekDrawable()

//调用系统自带的壁纸选择功能
Intent chooseIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
startActivity(Intent.createChooser(chooseIntent, "选择壁纸"));
  • AudioManager:音量和铃声模式控制
//控制手机音量,
adjustVolume(int direction, int flags) 

//同上,不过可以选择调节的声音类型
/**streamType参数:指定声音类型,有下述几种声音类型:STREAM_ALARM:手机闹铃,STREAM_MUSIC:手机音乐,STREAM_RING:电话铃声,STREAM_SYSTEAM:手机系统,STREAM_DTMF:音调,STREAM_NOTIFICATION:系统提示,STREAM_VOICE_CALL:语音电话
direction参数:AudioManager.ADJUST_LOWER(调小),AudioManager.ADJUST_RAISE(调大)
flags参数:可选的标志位,比如AudioManager.FLAG_SHOW_UI,显示进度条,AudioManager.PLAY_SOUND:播放声音*/
adjustStreamVolume(int streamType, int direction, int flags)

//直接设置音量大小
setStreamVolume(int streamType, int index, intflags)

//返回当前的音频模式
getMode( )

//设置声音模式 。返回值:有下述几种模式: MODE_NORMAL(普通),MODE_RINGTONE(铃声),MODE_IN_CALL(打电话),MODE_IN_COMMUNICATION(通话)
setMode( )

//返回当前的铃声模式
getRingerMode( )

//设置铃声模式 。返回值:有下述几种模式: RINGER_MODE_NORMAL(普通),RINGER_MODE_SILENT(静音),RINGER_MODE_VIBRATE(震动)
setRingerMode(int streamType)

//获得手机的当前音量,最大值为7,最小值为0,当设置为0的时候,会自动调整为震动模式
getStreamVolume(int streamType)

//获得手机某个声音类型的最大音量值
getStreamMaxVolume(int streamType)

//将手机某个声音类型设置为静音
setStreamMute(int streamType,boolean state)

//设置是否打开扩音器
setSpeakerphoneOn(boolean on)

//设置是否让麦克风静音
setMicrophoneMute(boolean on)

//判断麦克风是否静音或是否打开
isMicrophoneMute()

//判断是否有音乐处于活跃状态
isMusicActive()

//判断是否插入了耳机
isWiredHeadsetOn()

//放弃音频的焦点
abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl)

//调整最相关的流的音量,或者给定的回退流
adjustSuggestedStreamVolume(int,int suggestedStreamType intflags)

//给音频硬件设置一个varaible数量的参数值
getParameters(String keys)

//返回是否该用户的振动设置为振动类型
getVibrateSetting(int vibrateType)

//检查是否A2DP蓝牙耳机音频路由是打开或关闭
isBluetoothA2dpOn()

//显示当前平台是否支持使用SCO的关闭调用用例
isBluetoothScoAvailableOffCall()

//检查通信是否使用蓝牙SCO
isBluetoothScoOn()

//加载声音效果
loadSoundEffects()

//播放声音效果
playSoundEffect((int effectType, float volume)

//注册一个组件MEDIA_BUTTON意图的唯一接收机
egisterMediaButtonEventReceiver(ComponentName eventReceiver) 

//请求音频的焦点
requestAudioFocus(AudioManager.OnAudioFocusChangeListener l,int streamType,int durationHint) 

//要求使用蓝牙SCO耳机进行通讯
setBluetoothScoOn(boolean on)

//启动/停止蓝牙SCO音频连接
startBluetoothSco/stopBluetoothSco()

//卸载音效
unloadSoundEffects()
  • FingerprintManager:协调对指纹硬件的访问(已过时)
  • BiometricPrompt:管理系统提供的生物特征对话框
        val keyguardManager = context.getSystemService(AppCompatActivity.KEYGUARD_SERVICE) as KeyguardManager
        if (keyguardManager.isKeyguardSecure) {
            val authenticationCallback = object : BiometricPrompt.AuthenticationCallback() {
                override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                    LogUtil.d("onAuthenticationSucceeded: ")
                }

                override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                    LogUtil.d("onAuthenticationError: $errorCode, str: $errString")
                }
            }
            val handler = Handler(Looper.getMainLooper())
            val builder = BiometricPrompt.Builder(context)
                .setTitle("verify it is you?")
                .setNegativeButton("Negative Btn", { runnable: Runnable -> handler.post(runnable) }
                ) { _: DialogInterface?, _: Int ->
                    LogUtil.d("showLockScreen: negative btn clicked, do nothing")
                }
                .setSubtitle("that is subtitile")
            if (keyguardManager.isDeviceSecure) {
                builder.setDeviceCredentialAllowed(true)
            }
            val bp = builder.build()
            bp.authenticate(
                CancellationSignal(),
                { runnable: Runnable -> handler.post(runnable) },
                authenticationCallback
            )
        } else {
            LogUtil.d("showLockScreen:  no in scrue.... no password")
        }
  • MediaRouter:控制从当前设备到外部扬声器和目标设备的媒体通道和流的路由
  • ClipboardManager:用于在全局剪贴板中放置和检索文本
//剪贴板中保存的所有剪贴数据集
ClipData

//剪贴数据集中的一个数据条目
ClipData.Item

// 获取系统剪贴板
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);

// 创建一个剪贴数据集,包含一个普通文本数据条目(需要复制的数据)
ClipData clipData = ClipData.newPlainText(null, "需要复制的文本数据");

// 把数据集设置(复制)到剪贴板
clipboard.setPrimaryClip(clipData);

// 获取系统剪贴板
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);

// 获取剪贴板的剪贴数据集
ClipData clipData = clipboard.getPrimaryClip();
if (clipData != null && clipData.getItemCount() > 0) {
    // 从数据集中获取(粘贴)第一条文本数据
    CharSequence text = clipData.getItemAt(0).getText();
    System.out.println("text: " + text);
}

// 添加剪贴板数据改变监听器
clipboard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
    @Override
    public void onPrimaryClipChanged() {
        // 剪贴板中的数据被改变,此方法将被回调
        System.out.println("onPrimaryClipChanged()");
    }
});

// 移除指定的剪贴板数据改变监听器
clipboard.removePrimaryClipChangedListener(listener);
  • AppWidgetManager:更新AppWidget状态,获取关于已安装AppWidget提供商和其他AppWidget相关状态的信息
//一个action,添加一个appwidget到桌面显示,启动appwidget选择界面,必须对EXTRA_APPWIDGET_ID(和一个桌面小部件是一对一的关系)常量进行赋值,并会返回一个结果RESULT_CANCELED(Activity常量,删除)或者RESULT_OK(Activity常量,添加)
ACTION_APPWIDGET_PICK

//意义和上面相同,只不过显示的地方不同,一个在桌面,一个在keyguard
ACTION_KEYGUARD_APPWIDGET_PICK

//appwidget的id,唯一标志
EXTRA_APPWIDGET_ID

//6种广播常量:[appwidget provider中进行处理](https://www.cnblogs.com/liutao-guoyujiao/p/6498685.html)

//AppWidgetProvider组件名
EXTRA_APPWIDGET_PROVIDER

//私有常量(不是静态)
IAppWidgetService

//获取AppWidgetManager实例
getInstance(Context context)

//有3种重载形式,id数组,单一id,和appwidget provder组件名,会向相应的appwidget provider发出action=ACTION_APPWIDGET_UPDATE的广播
updateAppWidget(* *, RemoteViews views)

//有2种重载形式,id数组,单一id,会向相应的appwidget provider发出action=ACTION_APPWIDGET_UPDATE的广播;和2)区别是,局部更新3)性能更好
partiallyUpdateAppWidget(* *, RemoteViews views)

//更新appwidget的相关属性
updateAppWidgetOptions(int appWidgetId, Bundle options)
  • UsbManager:访问USB的状态并与USB设备通信
  • DownloadManager:用于处理长期运行的HTTP下载
  • BatteryManager:提供了查询电池和充电属性的方法
  • NfcManager:获取NfcAdapter实例以全面进行NFC管理
  • BluetoothManager:获取BluetoothAdapter实例以全面进行蓝牙管理
  • DisplayManager:管理显示设备
//根据displayId参数获得一个逻辑显示器的信息
public Display getDisplay(int displayId)

//获得当前所有有效的逻辑显示器列表
public Display[] getDisplays()

//登记一个显示监听对象,用来监听显示器的新增、去除或改变通知事件
public void registerDisplayListener(DisplayListener listener, Handler handler)

//取消先前登记的一个显示监听对象
public void unregisterDisplayListener(DisplayListener listener)

//启动WIFI显示器的扫描
scanWifiDisplays()

//根据设备地址连接WIFI显示器
public void connectWifiDisplay(String deviceAddress)

//断开WIFI显示器
public void disconnectWifiDisplay()

//为WIFI显示器命名
public void renameWifiDisplay(String deviceAddress, String alias)

//取消先前记忆的WIFI显示器
public void forgetWifiDisplay(String deviceAddress)

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