項目中遇見一個這樣的需求,就是當軟件在一定時間沒有操作時候需要彈出廣告頁面,當點擊廣告頁面時又進行軟件操作,也就是廣告要在軟件打開並且處於未操作狀態才會出來。
方法一:用handler+onTouchEvent實現延時發送請求
這個操作最好放到BaseActivity里進行。
[代碼]java代碼:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private
Handler handler =
new
Handler();
private
long
time=
1000
*
60
*
5
;
@Override
public
boolean
onTouchEvent(MotionEvent event) {
switch
(event.getAction()) {
case
MotionEvent.ACTION_DOWN:
handler.removeCallbacks(runnable);
break
;
case
MotionEvent.ACTION_UP:
startAD();
break
;
}
return
super
.onTouchEvent(event);
}
private
Runnable runnable =
new
Runnable() {
@Override
public
void
run() {
跳轉到廣告頁面
}
};
public
void
startAD() {
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, time);
}
|
方法二:通過PowerManager.WakeLock實現
判斷屏幕是否變暗的這個思路去實現。
方法三:使用雙線程來實現 (時間超時或者在接收到鎖屏廣播的時候顯示)
可以在application或者activity的oncreated方法里面啟動監聽。
[代碼]java代碼:
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
public
class
MainActivity
extends
Activity {
private
Handler mHandler01 =
new
Handler();
private
Handler mHandler02 =
new
Handler();
/* 上一次User有動作的Time Stamp */
private Date lastUpdateTime;
/* 計算User有幾秒沒有動作的 */
private long timePeriod;
/* 靜止超過N秒將自動進入屏保 */
private float mHoldStillTime = 10;
/*標識當前是否進入了屏保*/
private boolean isRunScreenSaver;
/*時間間隔*/
private long intervalScreenSaver = 1000;
private long intervalKeypadeSaver = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((Button)findViewById(R.id.start_screen_Saver)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent mService = new Intent(MainActivity.this, ScreenService.class);
mService.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startService(mService);
}
});
/* 初始取得User可觸碰屏幕的時間 */
lastUpdateTime = new Date(System.currentTimeMillis());
}
/**
* 計時線程
*/
private Runnable mTask01 = new Runnable() {
@Override
public void run() {
Date timeNow = new Date(System.currentTimeMillis());
/* 計算User靜止不動作的時間間距 */
/**當前的系統時間 - 上次觸摸屏幕的時間 = 靜止不動的時間**/
timePeriod = (long) timeNow.getTime() - (long) lastUpdateTime.getTime();
/*將靜止時間毫秒換算成秒*/
float timePeriodSecond = ((float) timePeriod / 1000);
if(timePeriodSecond > mHoldStillTime){
if(isRunScreenSaver == false){ //說明沒有進入屏保
/* 啟動線程去顯示屏保 */
mHandler02.postAtTime(mTask02, intervalScreenSaver);
/*顯示屏保置為true*/
isRunScreenSaver = true;
}else{
/*屏保正在顯示中*/
}
}else{
/*說明靜止之間沒有超過規定時長*/
isRunScreenSaver = false;
}
/*反復調用自己進行檢查*/
mHandler01.postDelayed(mTask01, intervalKeypadeSaver);
}
};
/**
* 持續屏保顯示線程
*/
private Runnable mTask02 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (isRunScreenSaver == true) { //如果屏保正在顯示,就計算不斷持續顯示
// hideOriginalLayout();
showScreenSaver();
mHandler02.postDelayed(mTask02, intervalScreenSaver);
} else {
mHandler02.removeCallbacks(mTask02); //如果屏保沒有顯示則移除線程
}
}
};
/**
* 顯示屏保
*/
private void showScreenSaver(){
Log.d("danxx", "顯示屏保------>");
Intent intent = new Intent(MainActivity.this, ScreenSaverActivity.class);
startActivity(intent);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
updateUserActionTime();
return super.dispatchKeyEvent(event);
}
/*用戶有操作的時候不斷重置靜止時間和上次操作的時間*/
public void updateUserActionTime() {
Date timeNow = new Date(System.currentTimeMillis());
timePeriod = timeNow.getTime() - lastUpdateTime.getTime();
lastUpdateTime.setTime(timeNow.getTime());
}
@Override
protected void onResume() {
/*activity顯示的時候啟動線程*/
mHandler01.postAtTime(mTask01, intervalKeypadeSaver);
super.onResume();
}
@Override
protected void onPause() {
/*activity不可見的時候取消線程*/
mHandler01.removeCallbacks(mTask01);
mHandler02.removeCallbacks(mTask02);
super
.onPause();
}
}
|
下面是啟動一個服務,當用戶按鎖屏鍵鎖屏的時候會發送一個廣播,我們在服務中接受到廣播后可以屏蔽系統的鎖屏,顯示我們自己的鎖屏:
[代碼]java代碼:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
public
class
ScreenService
extends
Service {
KeyguardManager mKeyguardManager =
null
;
private
KeyguardLock mKeyguardLock =
null
;
BroadcastReceiver mMasterResetReciever;
@Override
public
IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return
null
;
}
@Override
public
void
onCreate() {
//Log.e("ScreenService","onCreate()");
// TODO Auto-generated method stub
startScreenService();
super
.onCreate();
}
@Override
public
void
onStart(Intent intent,
int
startId) {
// Log.e("ScreenService","onStart");
// TODO Auto-generated method stub
startScreenService();
}
private
void
startScreenService(){
mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
mKeyguardLock = mKeyguardManager.newKeyguardLock(
""
);
mKeyguardLock.disableKeyguard();
//Intent.ACTION_SCREEN_OFF
mMasterResetReciever =
new
BroadcastReceiver() {
@Override
public
void
onReceive(Context context, Intent intent) {
try
{
Intent i =
new
Intent();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setClass(context, ScreenSaverActivity.
class
);
context.startActivity(i);
}
catch
(Exception e) {
Log.i(
"mMasterResetReciever:"
, e.toString());
}
}
};
registerReceiver(mMasterResetReciever,
new
IntentFilter(Intent.ACTION_SCREEN_OFF));
}
@Override
public
void
onDestroy() {
//Log.e("ScreenService","onDestroy()");
super
.onDestroy();
unregisterReceiver(mMasterResetReciever);
ScreenService.
this
.stopSelf();
}
}
|