【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗效果_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗效果_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗效果_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗效果_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗效果_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android如何實(shí)現(xiàn)懸浮窗效果

這篇文章主要介紹Android如何實(shí)現(xiàn)懸浮窗效果,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!請(qǐng)看下圖:

首先是一個(gè)小的懸浮窗顯示的是當(dāng)前使用了百分之多少的內(nèi)存,點(diǎn)擊一下小懸浮窗,就會(huì)彈出一個(gè)大的懸浮窗,可以一鍵加速。好,我們現(xiàn)在就來(lái)模擬實(shí)現(xiàn)一下類似的效果。先談一下基本的實(shí)現(xiàn)原理,這種桌面懸浮窗的效果很類似與Widget,但是它比Widget要靈活的多。主要是通過(guò)WindowManager這個(gè)類來(lái)實(shí)現(xiàn)的,調(diào)用這個(gè)類的addView方法用于添加一個(gè)懸浮窗,updateViewLayout方法用于更新懸浮窗的參數(shù),removeView用于移除懸浮窗。其中懸浮窗的參數(shù)有必要詳細(xì)說(shuō)明一下。WindowManager.LayoutParams這個(gè)類用于提供懸浮窗所需的參數(shù),其中有幾個(gè)經(jīng)常會(huì)用到的變量:type值用于確定懸浮窗的類型,一般設(shè)為2002,表示在所有應(yīng)用程序之上,但在狀態(tài)欄之下。flags值用于確定懸浮窗的行為,比如說(shuō)不可聚焦,非模態(tài)對(duì)話框等等,屬性非常多,大家可以查看文檔。gravity值用于確定懸浮窗的對(duì)齊方式,一般設(shè)為左上角對(duì)齊,這樣當(dāng)拖動(dòng)懸浮窗的時(shí)候方便計(jì)算坐標(biāo)。x值用于確定懸浮窗的位置,如果要橫向移動(dòng)懸浮窗,就需要改變這個(gè)值。y值用于確定懸浮窗的位置,如果要縱向移動(dòng)懸浮窗,就需要改變這個(gè)值。width值用于指定懸浮窗的寬度。height值用于指定懸浮窗的高度。創(chuàng)建懸浮窗這種窗體需要向用戶申請(qǐng)權(quán)限才可以的,因此還需要在AndroidManifest.xml中加入<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>原理介紹完了,下面我們開(kāi)始用代碼實(shí)現(xiàn)。首先在Eclipse中新建一個(gè)Android項(xiàng)目,項(xiàng)目名就叫做360FloatWindowDemo。然后寫一下布局文件,布局文件非常簡(jiǎn)單,只有一個(gè)按鈕,打開(kāi)或新建activity_main.xml,加入如下代碼:<RelativeLayout

xmlns:android="/apk/res/android"

xmlns:tools="/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>然后再新建一個(gè)名為float_window_small.xml的布局文件,用于做為小懸浮窗的布局,在其中加入如下代碼:<?xml

version="1.0"

encoding="UTF-8"?>

<LinearLayout

xmlns:android="/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>再新建一個(gè)名為float_window_big.xml的布局文件,用于做為大懸浮窗的布局,在其中加入如下代碼:<?xml

version="1.0"

encoding="UTF-8"?>

<LinearLayout

xmlns:android="/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="關(guān)閉懸浮窗"

/>

<Button

android:id="@+id/back"

android:layout_width="100dip"

android:layout_height="40dip"

android:layout_gravity="center_horizontal"

android:text="返回"

/>

</LinearLayout>兩個(gè)懸浮窗布局文件中用到的圖片資源,大家可以隨便找點(diǎn)圖片來(lái)代替,同時(shí)我會(huì)給出源碼,大家也可以從源碼中取出。然后打開(kāi)或創(chuàng)建MainActivity,這是項(xiàng)目的主界面在里面加入如下代碼: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的代碼非窗簡(jiǎn)單,就是對(duì)開(kāi)啟懸浮窗的按鈕注冊(cè)了一個(gè)點(diǎn)擊事件,用于打開(kāi)一個(gè)服務(wù),然后關(guān)閉當(dāng)前Activity。創(chuàng)建懸浮窗的邏輯都交給服務(wù)去做了。好,現(xiàn)在我們來(lái)創(chuàng)建這個(gè)服務(wù)。新建一個(gè)名為FloatWindowService的類,這個(gè)類繼承自Service在里面加入如下代碼:public

class

FloatWindowService

extends

Service

{

/**

*

用于在線程中創(chuàng)建或移除懸浮窗。

*/

private

Handler

handler

=

new

Handler();

/**

*

定時(shí)器,定時(shí)進(jìn)行檢測(cè)當(dāng)前應(yīng)該創(chuàng)建還是移除懸浮窗。

*/

private

Timer

timer;

@Override

public

IBinder

onBind(Intent

intent)

{

return

null;

}

@Override

public

int

onStartCommand(Intent

intent,

int

flags,

int

startId)

{

//

開(kāi)啟定時(shí)器,每隔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被終止的同時(shí)也停止定時(shí)器繼續(xù)運(yùn)行

timer.cancel();

timer

=

null;

}

class

RefreshTask

extends

TimerTask

{

@Override

public

void

run()

{

//

當(dāng)前界面是桌面,且沒(méi)有懸浮窗顯示,則創(chuàng)建懸浮窗。

if

(isHome()

&&

!MyWindowManager.isWindowShowing())

{

handler.post(new

Runnable()

{

@Override

public

void

run()

{

MyWindowManager.createSmallWindow(getApplicationContext());

}

});

}

//

當(dāng)前界面不是桌面,且有懸浮窗顯示,則移除懸浮窗。

else

if

(!isHome()

&&

MyWindowManager.isWindowShowing())

{

handler.post(new

Runnable()

{

@Override

public

void

run()

{

MyWindowManager.removeSmallWindow(getApplicationContext());

MyWindowManager.removeBigWindow(getApplicationContext());

}

});

}

//

當(dāng)前界面是桌面,且有懸浮窗顯示,則更新內(nèi)存數(shù)據(jù)。

else

if

(isHome()

&&

MyWindowManager.isWindowShowing())

{

handler.post(new

Runnable()

{

@Override

public

void

run()

{

MyWindowManager.updateUsedPercent(getApplicationContext());

}

});

}

}

}

/**

*

判斷當(dāng)前界面是否是桌面

*/

private

boolean

isHome()

{

ActivityManager

mActivityManager

=

(ActivityManager)

getSystemService(Context.ACTIVITY_SERVICE);

List<RunningTaskInfo>

rti

=

mActivityManager.getRunningTasks(1);

return

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

}

/**

*

獲得屬于桌面的應(yīng)用的應(yīng)用包名稱

*

*

@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方法中開(kāi)啟了一個(gè)定時(shí)器,每隔500毫秒就會(huì)執(zhí)行RefreshTask。在RefreshTask當(dāng)中,要進(jìn)行判斷,如果手機(jī)當(dāng)前是在桌面的話,就應(yīng)該顯示懸浮窗,如果手機(jī)打開(kāi)了某一個(gè)應(yīng)用程序,就應(yīng)該移除懸浮窗,如果手機(jī)在桌面的話,還應(yīng)該更新內(nèi)存使用百分比的數(shù)據(jù)。而當(dāng)FloatWindowService被銷毀的時(shí)候,應(yīng)該將定時(shí)器停止,否則它還會(huì)一直運(yùn)行。從上面的代碼我們也可以看出,創(chuàng)建和移除懸浮窗,以及更新懸浮窗內(nèi)的數(shù)據(jù),都是由MyWindowManager這個(gè)類來(lái)管理的,比起直接把這些代碼寫在Activity或Service當(dāng)中,使用一個(gè)專門的工具類來(lái)管理要好的多。不過(guò)要想創(chuàng)建懸浮窗,還是先要把懸浮窗的View寫出來(lái)。新建一個(gè)名叫FloatWindowSmallView的類,繼承自LinearLayout。新建一個(gè)名叫FloatWindowBigView的類,也繼承自LinearLayout。在FloatWindowSmallView中加入如下代碼:public

class

FloatWindowSmallView

extends

LinearLayout

{

/**

*

記錄小懸浮窗的寬度

*/

public

static

int

viewWidth;

/**

*

記錄小懸浮窗的高度

*/

public

static

int

viewHeight;

/**

*

記錄系統(tǒng)狀態(tài)欄的高度

*/

private

static

int

statusBarHeight;

/**

*

用于更新小懸浮窗的位置

*/

private

WindowManager

windowManager;

/**

*

小懸浮窗的參數(shù)

*/

private

WindowManager.LayoutParams

mParams;

/**

*

記錄當(dāng)前手指位置在屏幕上的橫坐標(biāo)值

*/

private

float

xInScreen;

/**

*

記錄當(dāng)前手指位置在屏幕上的縱坐標(biāo)值

*/

private

float

yInScreen;

/**

*

記錄手指按下時(shí)在屏幕上的橫坐標(biāo)的值

*/

private

float

xDownInScreen;

/**

*

記錄手指按下時(shí)在屏幕上的縱坐標(biāo)的值

*/

private

float

yDownInScreen;

/**

*

記錄手指按下時(shí)在小懸浮窗的View上的橫坐標(biāo)的值

*/

private

float

xInView;

/**

*

記錄手指按下時(shí)在小懸浮窗的View上的縱坐標(biāo)的值

*/

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:

//

手指按下時(shí)記錄必要數(shù)據(jù),縱坐標(biāo)的值都需要減去狀態(tài)欄高度

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

//

手指移動(dòng)的時(shí)候更新小懸浮窗的位置

updateViewPosition();

break;

case

MotionEvent.ACTION_UP:

//

如果手指離開(kāi)屏幕時(shí),xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,則視為觸發(fā)了單擊事件。

if

(xDownInScreen

==

xInScreen

&&

yDownInScreen

==

yInScreen)

{

openBigWindow();

}

break;

default:

break;

}

return

true;

}

/**

*

將小懸浮窗的參數(shù)傳入,用于更新小懸浮窗的位置。

*

*

@param

params

*

小懸浮窗的參數(shù)

*/

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

}

/**

*

打開(kāi)大懸浮窗,同時(shí)關(guān)閉小懸浮窗。

*/

private

void

openBigWindow()

{

MyWindowManager.createBigWindow(getContext());

MyWindowManager.removeSmallWindow(getContext());

}

/**

*

用于獲取狀態(tài)欄的高度。

*

*

@return

返回狀態(tài)欄高度的像素值。

*/

private

int

getStatusBarHeight()

{

if

(statusBarHeight

==

0)

{

try

{

Class<?>

c

=

Class.forName("ernal.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;

}其中,對(duì)這個(gè)View的onTouchEvent事件進(jìn)行了重寫,用于實(shí)現(xiàn)拖動(dòng)和點(diǎn)擊的效果。如果發(fā)現(xiàn)用戶觸發(fā)了ACTION_DOWN事件,會(huì)記錄按下時(shí)的坐標(biāo)等數(shù)據(jù)。如果發(fā)現(xiàn)用戶觸發(fā)了ACTION_MOVE事件,則根據(jù)當(dāng)前移動(dòng)的坐標(biāo)更新懸浮窗在屏幕中的位置。如果發(fā)現(xiàn)用戶觸發(fā)了ACTION_UP事件,會(huì)和ACTION_DOWN中記下的坐標(biāo)對(duì)比,如果發(fā)現(xiàn)是相同的,則視為用戶對(duì)懸浮窗進(jìn)行了點(diǎn)擊。點(diǎn)擊小懸浮窗則打開(kāi)大懸浮窗,然后我們來(lái)實(shí)現(xiàn)大懸浮窗的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)

{

//

點(diǎn)擊關(guān)閉懸浮窗的時(shí)候,移除所有懸浮窗,并停止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)

{

//

點(diǎn)擊返回的時(shí)候,移除大懸浮窗,創(chuàng)建小懸浮窗

MyWindowManager.removeBigWindow(context);

MyWindowManager.createSmallWindow(context);

}

});

}

}比起FloatWindowSmallView,F(xiàn)loatWindowBigView要簡(jiǎn)單的多,其中只有兩個(gè)按鈕,點(diǎn)擊close按鈕,將懸浮窗全部移除,并將Service終止。單擊back按鈕則移除大懸浮窗,重新創(chuàng)建小懸浮窗?,F(xiàn)在兩個(gè)懸浮窗的View都已經(jīng)寫好了,我們來(lái)創(chuàng)建MyWindowManager,代碼如下:public

class

MyWindowManager

{

/**

*

小懸浮窗View的實(shí)例

*/

private

static

FloatWindowSmallView

smallWindow;

/**

*

大懸浮窗View的實(shí)例

*/

private

static

FloatWindowBigView

bigWindow;

/**

*

小懸浮窗View的參數(shù)

*/

private

static

LayoutParams

smallWindowParams;

/**

*

大懸浮窗View的參數(shù)

*/

private

static

LayoutParams

bigWindowParams;

/**

*

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

*/

private

static

WindowManager

mWindowManager;

/**

*

用于獲取手機(jī)可用內(nèi)存

*/

private

static

ActivityManager

mActivityManager;

/**

*

創(chuàng)建一個(gè)小懸浮窗。初始位置為屏幕的右部中間位置。

*

*

@param

context

*

必須為應(yīng)用程序的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

*

必須為應(yīng)用程序的Context.

*/

public

static

void

removeSmallWindow(Context

context)

{

if

(smallWindow

!=

null)

{

WindowManager

windowManager

=

getWindowManager(context);

windowManager.removeView(smallWindow);

smallWindow

=

null;

}

}

/**

*

創(chuàng)建一個(gè)大懸浮窗。位置為屏幕正中間。

*

*

@param

context

*

必須為應(yīng)用程序的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

*

必須為應(yīng)用程序的Context.

*/

public

static

void

removeBigWindow(Context

context)

{

if

(bigWindow

!=

null)

{

WindowManager

windowManager

=

getWindowManager(context);

windowManager.removeView(bigWindow);

bigWindow

=

null;

}

}

/**

*

更新小懸浮窗的TextView上的數(shù)據(jù),顯示內(nèi)存使用的百分比。

*

*

@param

context

*

可傳入應(yīng)用程序上下文。

*/

public

static

void

updateUsedPercent(Context

context)

{

if

(smallWindow

!=

null)

{

TextView

percentView

=

(TextView)

smallWindow.findViewById(R.id.percent);

percentView.setText(getUsedPercentValue(context));

}

}

/**

*

是否有懸浮窗(包括小懸浮窗和大懸浮窗)顯示在屏幕上。

*

*

@return

有懸浮窗顯示在桌面上返回true,沒(méi)有的話返回false。

*/

public

static

boolean

isWindowShowing()

{

return

smallWindow

!=

null

||

bigWindow

!=

null;

}

/**

*

如果WindowManager還未創(chuàng)建,則創(chuàng)建一個(gè)新的WindowManager返回。否則返回當(dāng)前已創(chuàng)建的WindowManager。

*

*

@param

context

*

必須為應(yīng)用程序的Context.

*

@return

WindowManager的實(shí)例,用于控制在屏幕上添加或移除懸浮窗。

*/

private

static

WindowManager

getWindowManager(Context

context)

{

if

(mWindowManager

==

null)

{

mWindowManager

=

(WindowManager)

context.getSystemService(Context.WINDOW_SERVICE);

}

return

mWindowManager;

}

/**

*

如果ActivityManager還未創(chuàng)建,則創(chuàng)建一個(gè)新的ActivityManager返回。否則返回當(dāng)前已創(chuàng)建的ActivityManager。

*

*

@param

context

*

可傳入應(yīng)用程序上下文。

*

@return

ActivityManager的實(shí)例,用于獲取手機(jī)可用內(nèi)存。

*/

private

static

ActivityManager

getActivityManager(Context

context)

{

if

(mActivityManager

==

null)

{

mActivityManager

=

(ActivityManager)

context.getSystemService(Context.ACTIVITY_SERVICE);

}

return

mActivityManager;

}

/**

*

計(jì)算已使用內(nèi)存的百分比,并返回。

*

*

@param

context

*

可傳入應(yīng)用程序上下文。

*

@return

已使用內(nèi)存的百分比,以字符串形式返回。

*/

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

"懸浮窗";

}

/**

*

獲取當(dāng)前可用內(nèi)存,返回?cái)?shù)據(jù)以字節(jié)為單位。

*

*

@param

context

*

可傳入應(yīng)用程序上下文。

*

@return

當(dāng)前可用內(nèi)存。

*/

private

static

long

getAvailableMemory(Context

context)

{

ActivityMan

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論