请看下图:

                       

首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速。好,我们现在就来模拟实现一下类似的效果。

先谈一下基本的实现原理,这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多。主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,updateViewLayout方法用于更新悬浮窗的参数,removeView用于移除悬浮窗。其中悬浮窗的参数有必要详细说明一下。

WindowManager.LayoutParams这个类用于提供悬浮窗所需的参数,其中有几个经常会用到的变量:

type值用于确定悬浮窗的类型,一般设为2002,表示在所有应用程序之上,但在状态栏之下。

flags值用于确定悬浮窗的行为,比如说不可聚焦,非模态对话框等等,属性非常多,大家可以查看文档。

gravity值用于确定悬浮窗的对齐方式,一般设为左上角对齐,这样当拖动悬浮窗的时候方便计算坐标。

x值用于确定悬浮窗的位置,如果要横向移动悬浮窗,就需要改变这个值。

y值用于确定悬浮窗的位置,如果要纵向移动悬浮窗,就需要改变这个值。

width值用于指定悬浮窗的宽度。

height值用于指定悬浮窗的高度。

创建悬浮窗这种窗体需要向用户申请权限才可以的,因此还需要在AndroidManifest.xml中加入<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

原理介绍完了,下面我们开始用代码实现。首先在Eclipse中新建一个Android项目,项目名就叫做360FloatWindowDemo。然后写一下布局文件,布局文件非常简单,只有一个按钮,打开或新建activity_main.xml,加入如下代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

tools:context=".MainActivity" >

<Button

android:id="@+id/start_float_window"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Start Float Window" >

</Button>

</RelativeLayout>

然后再新建一个名为float_window_small.xml的布局文件,用于做为小悬浮窗的布局,在其中加入如下代码:

<?xml version="1.0" encoding="UTF-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/small_window_layout"

android:layout_width="60dip"

android:layout_height="25dip"

android:background="@drawable/bg_small"

>

<TextView

android:id="@+id/percent"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="center"

android:textColor="#ffffff"

/>

</LinearLayout>

再新建一个名为float_window_big.xml的布局文件,用于做为大悬浮窗的布局,在其中加入如下代码:

<?xml version="1.0" encoding="UTF-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/big_window_layout"

android:layout_width="200dip"

android:layout_height="100dip"

android:background="@drawable/bg_big"

android:orientation="vertical"

>

<Button

android:id="@+id/close"

android:layout_width="100dip"

android:layout_height="40dip"

android:layout_gravity="center_horizontal"

android:layout_marginTop="12dip"

android:text="关闭悬浮窗"

/>

<Button

android:id="@+id/back"

android:layout_width="100dip"

android:layout_height="40dip"

android:layout_gravity="center_horizontal"

android:text="返回"

/>

</LinearLayout>

两个悬浮窗布局文件中用到的图片资源,大家可以随便找点图片来代替,同时我会给出源码,大家也可以从源码中取出。

然后打开或创建MainActivity,这是项目的主界面,在里面加入如下代码:

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button startFloatWindow = (Button) findViewById(R.id.start_float_window);

startFloatWindow.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

Intent intent = new Intent(MainActivity.this, FloatWindowService.class);

startService(intent);

finish();

}

});

}

}

这里可以看到,MainActivity的代码非窗简单,就是对开启悬浮窗的按钮注册了一个点击事件,用于打开一个服务,然后关闭当前Activity。创建悬浮窗的逻辑都交给服务去做了。好,现在我们来创建这个服务。新建一个名为FloatWindowService的类,这个类继承自Service,在里面加入如下代码:

public class FloatWindowService extends Service {

/**

* 用于在线程中创建或移除悬浮窗。

*/

private Handler handler = new Handler();

/**

* 定时器,定时进行检测当前应该创建还是移除悬浮窗。

*/

private Timer timer;

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

// 开启定时器,每隔0.5秒刷新一次

if (timer == null) {

timer = new Timer();

timer.scheduleAtFixedRate(new RefreshTask(), 0, 500);

}

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

}

@Override

public void onDestroy() {

super.onDestroy();

// Service被终止的同时也停止定时器继续运行

timer.cancel();

timer = null;

}

class RefreshTask extends TimerTask {

@Override

public void run() {

// 当前界面是桌面,且没有悬浮窗显示,则创建悬浮窗。

if (isHome() && !MyWindowManager.isWindowShowing()) {

handler.post(new Runnable() {

@Override

public void run() {

MyWindowManager.createSmallWindow(getApplicationContext());

}

});

}

// 当前界面不是桌面,且有悬浮窗显示,则移除悬浮窗。

else if (!isHome() && MyWindowManager.isWindowShowing()) {

handler.post(new Runnable() {

@Override

public void run() {

MyWindowManager.removeSmallWindow(getApplicationContext());

MyWindowManager.removeBigWindow(getApplicationContext());

}

});

}

// 当前界面是桌面,且有悬浮窗显示,则更新内存数据。

else if (isHome() && MyWindowManager.isWindowShowing()) {

handler.post(new Runnable() {

@Override

public void run() {

MyWindowManager.updateUsedPercent(getApplicationContext());

}

});

}

}

}

/**

* 判断当前界面是否是桌面

*/

private boolean isHome() {

ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);

return getHomes().contains(rti.get(0).topActivity.getPackageName());

}

/**

* 获得属于桌面的应用的应用包名称

*

* @return 返回包含所有包名的字符串列表

*/

private List<String> getHomes() {

List<String> names = new ArrayList<String>();

PackageManager packageManager = this.getPackageManager();

Intent intent = new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,

PackageManager.MATCH_DEFAULT_ONLY);

for (ResolveInfo ri : resolveInfo) {

names.add(ri.activityInfo.packageName);

}

return names;

}

}

FloatWindowService的onStartCommand方法中开启了一个定时器,每隔500毫秒就会执行RefreshTask。在RefreshTask当中,要进行判断,如果手机当前是在桌面的话,就应该显示悬浮窗,如果手机打开了某一个应用程序,就应该移除悬浮窗,如果手机在桌面的话,还应该更新内存使用百分比的数据。而当FloatWindowService被销毁的时候,应该将定时器停止,否则它还会一直运行。

从上面的代码我们也可以看出,创建和移除悬浮窗,以及更新悬浮窗内的数据,都是由MyWindowManager这个类来管理的,比起直接把这些代码写在Activity或Service当中,使用一个专门的工具类来管理要好的多。不过要想创建悬浮窗,还是先要把悬浮窗的View写出来。

新建一个名叫FloatWindowSmallView的类,继承自LinearLayout。新建一个名叫FloatWindowBigView的类,也继承自LinearLayout。

在FloatWindowSmallView中加入如下代码:

public class FloatWindowSmallView extends LinearLayout {

/**

* 记录小悬浮窗的宽度

*/

public static int viewWidth;

/**

* 记录小悬浮窗的高度

*/

public static int viewHeight;

/**

* 记录系统状态栏的高度

*/

private static int statusBarHeight;

/**

* 用于更新小悬浮窗的位置

*/

private WindowManager windowManager;

/**

* 小悬浮窗的参数

*/

private WindowManager.LayoutParams mParams;

/**

* 记录当前手指位置在屏幕上的横坐标值

*/

private float xInScreen;

/**

* 记录当前手指位置在屏幕上的纵坐标值

*/

private float yInScreen;

/**

* 记录手指按下时在屏幕上的横坐标的值

*/

private float xDownInScreen;

/**

* 记录手指按下时在屏幕上的纵坐标的值

*/

private float yDownInScreen;

/**

* 记录手指按下时在小悬浮窗的View上的横坐标的值

*/

private float xInView;

/**

* 记录手指按下时在小悬浮窗的View上的纵坐标的值

*/

private float yInView;

public FloatWindowSmallView(Context context) {

super(context);

windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

LayoutInflater.from(context).inflate(R.layout.float_window_small, this);

View view = findViewById(R.id.small_window_layout);

viewWidth = view.getLayoutParams().width;

viewHeight = view.getLayoutParams().height;

TextView percentView = (TextView) findViewById(R.id.percent);

percentView.setText(MyWindowManager.getUsedPercentValue(context));

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

// 手指按下时记录必要数据,纵坐标的值都需要减去状态栏高度

xInView = event.getX();

yInView = event.getY();

xDownInScreen = event.getRawX();

yDownInScreen = event.getRawY() - getStatusBarHeight();

xInScreen = event.getRawX();

yInScreen = event.getRawY() - getStatusBarHeight();

break;

case MotionEvent.ACTION_MOVE:

xInScreen = event.getRawX();

yInScreen = event.getRawY() - getStatusBarHeight();

// 手指移动的时候更新小悬浮窗的位置

updateViewPosition();

break;

case MotionEvent.ACTION_UP:

// 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。

if (xDownInScreen == xInScreen && yDownInScreen == yInScreen) {

openBigWindow();

}

break;

default:

break;

}

return true;

}

/**

* 将小悬浮窗的参数传入,用于更新小悬浮窗的位置。

*

* @param params

*            小悬浮窗的参数

*/

public void setParams(WindowManager.LayoutParams params) {

mParams = params;

}

/**

* 更新小悬浮窗在屏幕中的位置。

*/

private void updateViewPosition() {

mParams.x = (int) (xInScreen - xInView);

mParams.y = (int) (yInScreen - yInView);

windowManager.updateViewLayout(this, mParams);

}

/**

* 打开大悬浮窗,同时关闭小悬浮窗。

*/

private void openBigWindow() {

MyWindowManager.createBigWindow(getContext());

MyWindowManager.removeSmallWindow(getContext());

}

/**

* 用于获取状态栏的高度。

*

* @return 返回状态栏高度的像素值。

*/

private int getStatusBarHeight() {

if (statusBarHeight == 0) {

try {

Class<?> c = Class.forName("com.android.internal.R$dimen");

Object o = c.newInstance();

Field field = c.getField("status_bar_height");

int x = (Integer) field.get(o);

statusBarHeight = getResources().getDimensionPixelSize(x);

} catch (Exception e) {

e.printStackTrace();

}

}

return statusBarHeight;

}

其中,对这个View的onTouchEvent事件进行了重写,用于实现拖动和点击的效果。如果发现用户触发了ACTION_DOWN事件,会记录按下时的坐标等数据。如果发现用户触发了ACTION_MOVE事件,则根据当前移动的坐标更新悬浮窗在屏幕中的位置。如果发现用户触发了ACTION_UP事件,会和ACTION_DOWN中记下的坐标对比,如果发现是相同的,则视为用户对悬浮窗进行了点击。点击小悬浮窗则打开大悬浮窗,然后我们来实现大悬浮窗的View。

在FloatWindowBigView中加入如下代码:

public class FloatWindowBigView extends LinearLayout {

/**

* 记录大悬浮窗的宽度

*/

public static int viewWidth;

/**

* 记录大悬浮窗的高度

*/

public static int viewHeight;

public FloatWindowBigView(final Context context) {

super(context);

LayoutInflater.from(context).inflate(R.layout.float_window_big, this);

View view = findViewById(R.id.big_window_layout);

viewWidth = view.getLayoutParams().width;

viewHeight = view.getLayoutParams().height;

Button close = (Button) findViewById(R.id.close);

Button back = (Button) findViewById(R.id.back);

close.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 点击关闭悬浮窗的时候,移除所有悬浮窗,并停止Service

MyWindowManager.removeBigWindow(context);

MyWindowManager.removeSmallWindow(context);

Intent intent = new Intent(getContext(), FloatWindowService.class);

context.stopService(intent);

}

});

back.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 点击返回的时候,移除大悬浮窗,创建小悬浮窗

MyWindowManager.removeBigWindow(context);

MyWindowManager.createSmallWindow(context);

}

});

}

}

比起FloatWindowSmallView,FloatWindowBigView要简单的多,其中只有两个按钮,点击close按钮,将悬浮窗全部移除,并将Service终止。单击back按钮则移除大悬浮窗,重新创建小悬浮窗。

现在两个悬浮窗的View都已经写好了,我们来创建MyWindowManager,代码如下:

public class MyWindowManager {

/**

* 小悬浮窗View的实例

*/

private static FloatWindowSmallView smallWindow;

/**

* 大悬浮窗View的实例

*/

private static FloatWindowBigView bigWindow;

/**

* 小悬浮窗View的参数

*/

private static LayoutParams smallWindowParams;

/**

* 大悬浮窗View的参数

*/

private static LayoutParams bigWindowParams;

/**

* 用于控制在屏幕上添加或移除悬浮窗

*/

private static WindowManager mWindowManager;

/**

* 用于获取手机可用内存

*/

private static ActivityManager mActivityManager;

/**

* 创建一个小悬浮窗。初始位置为屏幕的右部中间位置。

*

* @param context

*            必须为应用程序的Context.

*/

public static void createSmallWindow(Context context) {

WindowManager windowManager = getWindowManager(context);

int screenWidth = windowManager.getDefaultDisplay().getWidth();

int screenHeight = windowManager.getDefaultDisplay().getHeight();

if (smallWindow == null) {

smallWindow = new FloatWindowSmallView(context);

if (smallWindowParams == null) {

smallWindowParams = new LayoutParams();

smallWindowParams.type = LayoutParams.TYPE_PHONE;

smallWindowParams.format = PixelFormat.RGBA_8888;

smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL

| LayoutParams.FLAG_NOT_FOCUSABLE;

smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;

smallWindowParams.width = FloatWindowSmallView.viewWidth;

smallWindowParams.height = FloatWindowSmallView.viewHeight;

smallWindowParams.x = screenWidth;

smallWindowParams.y = screenHeight / 2;

}

smallWindow.setParams(smallWindowParams);

windowManager.addView(smallWindow, smallWindowParams);

}

}

/**

* 将小悬浮窗从屏幕上移除。

*

* @param context

*            必须为应用程序的Context.

*/

public static void removeSmallWindow(Context context) {

if (smallWindow != null) {

WindowManager windowManager = getWindowManager(context);

windowManager.removeView(smallWindow);

smallWindow = null;

}

}

/**

* 创建一个大悬浮窗。位置为屏幕正中间。

*

* @param context

*            必须为应用程序的Context.

*/

public static void createBigWindow(Context context) {

WindowManager windowManager = getWindowManager(context);

int screenWidth = windowManager.getDefaultDisplay().getWidth();

int screenHeight = windowManager.getDefaultDisplay().getHeight();

if (bigWindow == null) {

bigWindow = new FloatWindowBigView(context);

if (bigWindowParams == null) {

bigWindowParams = new LayoutParams();

bigWindowParams.x = screenWidth / 2 - FloatWindowBigView.viewWidth / 2;

bigWindowParams.y = screenHeight / 2 - FloatWindowBigView.viewHeight / 2;

bigWindowParams.type = LayoutParams.TYPE_PHONE;

bigWindowParams.format = PixelFormat.RGBA_8888;

bigWindowParams.gravity = Gravity.LEFT | Gravity.TOP;

bigWindowParams.width = FloatWindowBigView.viewWidth;

bigWindowParams.height = FloatWindowBigView.viewHeight;

}

windowManager.addView(bigWindow, bigWindowParams);

}

}

/**

* 将大悬浮窗从屏幕上移除。

*

* @param context

*            必须为应用程序的Context.

*/

public static void removeBigWindow(Context context) {

if (bigWindow != null) {

WindowManager windowManager = getWindowManager(context);

windowManager.removeView(bigWindow);

bigWindow = null;

}

}

/**

* 更新小悬浮窗的TextView上的数据,显示内存使用的百分比。

*

* @param context

*            可传入应用程序上下文。

*/

public static void updateUsedPercent(Context context) {

if (smallWindow != null) {

TextView percentView = (TextView) smallWindow.findViewById(R.id.percent);

percentView.setText(getUsedPercentValue(context));

}

}

/**

* 是否有悬浮窗(包括小悬浮窗和大悬浮窗)显示在屏幕上。

*

* @return 有悬浮窗显示在桌面上返回true,没有的话返回false。

*/

public static boolean isWindowShowing() {

return smallWindow != null || bigWindow != null;

}

/**

* 如果WindowManager还未创建,则创建一个新的WindowManager返回。否则返回当前已创建的WindowManager。

*

* @param context

*            必须为应用程序的Context.

* @return WindowManager的实例,用于控制在屏幕上添加或移除悬浮窗。

*/

private static WindowManager getWindowManager(Context context) {

if (mWindowManager == null) {

mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

}

return mWindowManager;

}

/**

* 如果ActivityManager还未创建,则创建一个新的ActivityManager返回。否则返回当前已创建的ActivityManager。

*

* @param context

*            可传入应用程序上下文。

* @return ActivityManager的实例,用于获取手机可用内存。

*/

private static ActivityManager getActivityManager(Context context) {

if (mActivityManager == null) {

mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

}

return mActivityManager;

}

/**

* 计算已使用内存的百分比,并返回。

*

* @param context

*            可传入应用程序上下文。

* @return 已使用内存的百分比,以字符串形式返回。

*/

public static String getUsedPercentValue(Context context) {

String dir = "/proc/meminfo";

try {

FileReader fr = new FileReader(dir);

BufferedReader br = new BufferedReader(fr, 2048);

String memoryLine = br.readLine();

String subMemoryLine = memoryLine.substring(memoryLine.indexOf("MemTotal:"));

br.close();

long totalMemorySize = Integer.parseInt(subMemoryLine.replaceAll("\\D+", ""));

long availableSize = getAvailableMemory(context) / 1024;

int percent = (int) ((totalMemorySize - availableSize) / (float) totalMemorySize * 100);

return percent + "%";

} catch (IOException e) {

e.printStackTrace();

}

return "悬浮窗";

}

/**

* 获取当前可用内存,返回数据以字节为单位。

*

* @param context

*            可传入应用程序上下文。

* @return 当前可用内存。

*/

private static long getAvailableMemory(Context context) {

ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();

getActivityManager(context).getMemoryInfo(mi);

return mi.availMem;

}

}

这个类负责了控制大悬浮窗,小悬浮窗的创建和移除,系统内存使用百分比的计算等操作。

到这里基本所有的代码都已经写完了,然后我们来看一下AndroidManifest.xml文件吧,里面代码如下:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.demo.floatwindowdemo"

android:versionCode="1"

android:versionName="1.0" >

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="8" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.demo.floatwindowdemo.MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<service android:name=".FloatWindowService"></service>

</application>

</manifest>

比较简单,记得把Activity和Service在里面注册好,还有一个权限声明需要添加的android.permission.SYSTEM_ALERT_WINDOW,表示需要用户授权允许创建系统提示窗口,也就是我们的桌面悬浮窗。

好了,现在让我们运行一下项目吧,效果如下图,主界面只有一个简单的按钮,点击按钮后,Activity被关闭,小悬浮窗显示在桌面上。其中显示着当前内存使用的百分比。

                     

小悬浮窗是可以自由拖动的,如果打开了其它的应用程序,小悬浮窗会自动隐藏,回到桌面后小悬浮窗又会显示出来。

                   

如果点击了小悬浮窗会弹出大悬浮窗来,这里我们大悬浮窗做的比较简单,就只有两个按钮。大悬浮窗展示的时候手机的所有其它程序是不可点的,因为焦点都在悬浮窗上了。点击返回按钮会重新展示小悬浮窗,点击关闭悬浮窗按钮,Service也会一起停掉。

Android仿360手机卫士悬浮窗效果的更多相关文章

  1. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  2. Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...

  3. ANDROID——仿360手机卫士的旋转打分控件

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简介 灵感源自360手机卫,主要功能就是实现显示评分或等级的效果.并稍微改良了一下,有更好 ...

  4. 仿360手机卫士界面效果android版源码

    仿360手机卫士界面效果android版,这个今天一大早在源码天堂的那个网站上看到了一个那个网站最新更新的一个源码,所以就分享给大学习一下吧,布局还挺不错的,而且也很简单的,我就不把我修改的那个分享出 ...

  5. Android 自定义View修炼-仿360手机卫士波浪球进度的实现

    像360卫士的波浪球进度的效果,一般最常用的方法就是 画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域. 今天我这用图片bitmap的方式,大概的方法原理是: (1)首先用 ...

  6. Android 控件进阶修炼-仿360手机卫士波浪球进度控件

    技术:Android+java   概述 像360卫士的波浪球进度的效果,一般最常用的方法就是 画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域. 今天我这用图片bitma ...

  7. Android 仿百度手机助手首页滑动效果

    今天看到百度手机助手首页上的滑动效果非常nice,主要功能归结为: 1.当手指上划时,顶部搜索栏随手指移动距离而缩小到隐藏,隐藏后内容还是可以继续移动 2.手指下滑时,当显示内容达到第一个时,顶部搜索 ...

  8. Android手机安全软件的恶意程序检测靠谱吗--LBE安全大师、腾讯手机管家、360手机卫士恶意软件检测方法研究

    转载请注明出处,谢谢. Android系统开放,各大论坛活跃,应用程序分发渠道广泛,这也就为恶意软件的传播提供了良好的环境.好在手机上安装了安全软件,是否能有效的检测出恶意软件呢?下边针对LBE安全大 ...

  9. Android静默安装实现方案,仿360手机助手秒装和智能安装功能

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有非常多朋友都问过我.在Android系统中如何才干实现静默安装 ...

随机推荐

  1. /etc/securetty文件

    /etc/securetty 文件允许你规定“root”用户可以从哪个tty设备登录. 登录程序(通常是/bin/login)需要读取“/etc/securetty”文件. 它的格式:列出来的tty设 ...

  2. 安装oracleASM

    问题:oracleasm status不能启动 解决方案: [root@localhost ~]# oracleasm statusChecking if ASM is loaded: noCheck ...

  3. IOS - 开发之内存缓存机制

    使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...

  4. java课后作业5

    [问题]随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路: 1.申请一个长度为10的数组 2.计算机随机生成10个数,并赋给数组 3. ...

  5. October 4th 2016 Week 41st Tuesday

    Patience! The windmill never strays in search of the wind. 耐心等待!风车从不跑去找风. Sometimes we need to be pa ...

  6. Centos7 设置Swap分区

    1.使用dd命令创建一个swap交换文件 dd if=/dev/zero of=/home/swap bs=1024 count=1024000 2.制作为swap格式文件: mkswap /home ...

  7. 413. Arithmetic Slices

    /**************************Sorry. We do not have enough accepted submissions.*********************** ...

  8. Android之WebView学习

    WebView常用方法 WebSettings 在使用WebView前我们都要进行相关的配置,常见的操作如下: WebSettings settings = mWebView.getSettings( ...

  9. hdu 5018 Revenge of Fibonacci

    大水题 #include<time.h> #include <cstdio> #include <iostream> #include<algorithm&g ...

  10. UVA 10252

    按照字典序输出最长公共子序列 #include<time.h> #include <cstdio> #include <iostream> #include< ...