Android实现app长时间未操作时自动退出app

这里要考虑3个问题,第一个是锁屏问题,第二个是app被切换至后台的问题,第三个是屏幕锁定和解除时app在后台时的问题

 

一,监听屏幕解锁,锁定

?
1
2
3
4
5
6
7
8
9
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
129
130
131
132
133
134
135
136
137
138
139
140
public  class  ScreenObserver {
 
     private  static  String TAG =  "ScreenObserver" ;
     private  Context mContext;
     private  ScreenBroadcastReceiver mScreenReceiver;
     private  ScreenStateListener mScreenStateListener;
     private  static  Method mReflectScreenState;
 
     public  ScreenObserver(Context context) {
         mContext = context;
         mScreenReceiver =  new  ScreenBroadcastReceiver();
         try  {
             mReflectScreenState = PowerManager. class .getMethod( "isScreenOn" ,
                     new  Class[] {});
         catch  (NoSuchMethodException nsme) {
             Log.d(TAG,  "API < 7,"  + nsme);
         }
     }
 
     /**
      * screen状态广播接收者
     
      * @author xishaomin
     
      */
     private  class  ScreenBroadcastReceiver  extends  BroadcastReceiver {
         private  String action =  null ;
 
         @Override
         public  void  onReceive(Context context, Intent intent) {
             action = intent.getAction();
             if  (Intent.ACTION_SCREEN_ON.equals(action)) {
                 mScreenStateListener.onScreenOn();
             else  if  (Intent.ACTION_SCREEN_OFF.equals(action)) {
                 mScreenStateListener.onScreenOff();
             } else  if (Intent.ACTION_USER_PRESENT.equals(action)){
                 LogUtils.d( "---->屏幕解锁完成" );
             }
         }
     }
 
     /**
      * 请求screen状态更新
     
      * @param listener
      */
     public  void  requestScreenStateUpdate(ScreenStateListener listener) {
         mScreenStateListener = listener;
         startScreenBroadcastReceiver();
 
         firstGetScreenState();
     }
 
     /**
      * 第一次请求screen状态
      */
     private  void  firstGetScreenState() {
         PowerManager manager = (PowerManager) mContext
                 .getSystemService(Activity.POWER_SERVICE);
         if  (isScreenOn(manager)) {
             if  (mScreenStateListener !=  null ) {
                 mScreenStateListener.onScreenOn();
             }
         else  {
             if  (mScreenStateListener !=  null ) {
                 mScreenStateListener.onScreenOff();
             }
         }
     }
 
     /**
      * 停止screen状态更新
      */
     public  void  stopScreenStateUpdate() {
         mContext.unregisterReceiver(mScreenReceiver);
     }
 
     /**
      * 启动screen状态广播接收器
      */
     private  void  startScreenBroadcastReceiver() {
         IntentFilter filter =  new  IntentFilter();
         filter.addAction(Intent.ACTION_SCREEN_ON);
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         //当用户解锁屏幕时
         filter.addAction(Intent.ACTION_USER_PRESENT);
         mContext.registerReceiver(mScreenReceiver, filter);
     }
 
     /**
      * screen是否打开状态
     
      * @param pm
      * @return
      */
     private  static  boolean  isScreenOn(PowerManager pm) {
         boolean  screenState;
         try  {
             screenState = (Boolean) mReflectScreenState.invoke(pm);
         catch  (Exception e) {
             screenState =  false ;
         }
         return  screenState;
     }
 
     public  interface  ScreenStateListener {
         public  void  onScreenOn();
 
         public  void  onScreenOff();
     }
     /**
      * 判断屏幕是否已被锁定
      * @param c
      * @return
      */
     public  final  static  boolean  isScreenLocked(Context c) 
     {  
         android.app.KeyguardManager mKeyguardManager = (KeyguardManager) c  
                 .getSystemService(Context.KEYGUARD_SERVICE);  
         return  mKeyguardManager.inKeyguardRestrictedInputMode();  
     }  
     
     /**
      * 判断当前应用是否是本应用
      * @param context
      * @return
      */
     public  static  boolean  isApplicationBroughtToBackground( final  Context context) {
         ActivityManager am = (ActivityManager) context
                 .getSystemService(Context.ACTIVITY_SERVICE);
         List<RunningTaskInfo> tasks = am.getRunningTasks( 1 );
         if  (!tasks.isEmpty()) {
             ComponentName topActivity = tasks.get( 0 ).topActivity;
             if  (!topActivity.getPackageName().equals(context.getPackageName())) {
                 return  true ;
             }
         }
         return  false ;
     }
}

然后在app的BaseActivity中实现ScreenObserver

?
1
2
3
4
5
6
7
8
9
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
        private  ScreenObservermScreenObserver;
        
        @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         
         mScreenObserver =  new  ScreenObserver( this );
         mScreenObserver.requestScreenStateUpdate( new  ScreenStateListener() {
             @Override
             public  void  onScreenOn() {
                 if (!ScreenObserver.isApplicationBroughtToBackground(MainActivity. this ))
                 {
                     cancelAlarmManager();
                 }
             }
 
             @Override
             public  void  onScreenOff() {
                 if (!ScreenObserver.isApplicationBroughtToBackground(MainActivity. this ))
                 {
                     cancelAlarmManager();
                     setAlarmManager();
                 }
             }
         });
         
     }
         
///此处省略一大坨代码
/**
  * 设置定时器管理器
  */
private  void  setAlarmManager()
{
     
         long  numTimeout =  300 * 1000 ; //5分钟
         LogUtils.d( "isTimeOutMode=yes,timeout=" +numTimeout);
         Intent alarmIntent =  new  Intent(MainActivity. this , TimeoutService. class );
         alarmIntent.putExtra( "action" "timeout" );  //自定义参数
         PendingIntent pi = PendingIntent.getService(MainActivity. this 1024 , alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
         AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
         long  triggerAtTime =  (System.currentTimeMillis()+numTimeout); 
         am.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pi);  //设定的一次性闹钟,这里决定是否使用绝对时间
         LogUtils.d( "----->设置定时器" );
     }
     /**
      * 取消定时管理器
      */
     private  void  cancelAlarmManager()
     {
         AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
         Intent intent =  new  Intent(MainActivity. this , TimeoutService. class ); 
         PendingIntent pi = PendingIntent.getService(MainActivity. this 1024 , intent,PendingIntent.FLAG_UPDATE_CURRENT);
         // 与上面的intent匹配(filterEquals(intent))的闹钟会被取消 
         alarmMgr.cancel(pi);
         LogUtils.d( "----->取消定时器" );
     }
     
         @Override
     protected  void  onResume() {
         LogUtils.e( "MainActivity-onResume" );
         super .onResume();
         cancelAlarmManager();
         activityIsActive =  true ;
         LogUtils.d( "activityIsActive=" +activityIsActive);
     }
     
     @Override
     protected  void  onStop() {
         LogUtils.e( "onStop" );
         super .onStop();
         if  (ScreenObserver.isApplicationBroughtToBackground( this ))
         {
             cancelAlarmManager();
             setAlarmManager();
         }
     }

然后在后台finishActivity

?
1
2
3
4
5
6
7
8
9
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
public  class  TimeoutService  extends  Service  implements  AppConstants {
 
     @Override
     public  IBinder onBind(Intent arg0) {
         return  null ;
     }
 
     boolean  isrun =  true ;
 
     @Override
     public  void  onCreate() {
         LogUtils.e( "BindService-->onCreate()" );
         super .onCreate();
     }
     
     @Override
     public  int  onStartCommand(Intent intent,  int  flags,  int  startId) {
         LogUtils.e( "BindService-->onStartCommand()" );
         forceApplicationExit();
         return  super .onStartCommand(intent, flags, startId);
         
     }
     
     private  void  forceApplicationExit()
     {
         new  Thread( new  Runnable() {
             @Override
             public  void  run() {
                 ActivityListUtil.getInstence().cleanActivityList();
                 stopSelf();
                     }
             }).start();
     }
 
     @Override
     public  void  onDestroy() {
         super .onDestroy();
         isrun =  false ;
     }
 
}

ActivityListUtil类如下

?
1
2
3
4
5
6
7
8
9
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
public  class  ActivityListUtil {
     private  static  ActivityListUtil instence;
     public  ArrayList<Activity> activityList;
 
     public  ActivityListUtil() {
         activityList =  new  ArrayList<Activity>();
     }
     public  static  ActivityListUtil getInstence() 
     {
         if  (instence ==  null ) {
             instence =  new  ActivityListUtil();
         }
         return  instence;
     }
     public  void  addActivityToList(Activity activity) {
         if (activity!= null )
         {
             activityList.add(activity);
         }
     }
     public  void  removeActivityFromList(Activity activity)
     {
         if (activityList!= null  && activityList.size()> 0 )
         {
             activityList.remove(activity);
         }
     }
     public  void  cleanActivityList() {
         if  (activityList!= null  && activityList.size() >  0 ) {
             for  ( int  i =  0 ; i < activityList.size(); i++) {
                 Activity activity = activityList.get(i);
                 if (activity!= null  && !activity.isFinishing())
                 {
                     activity.finish();
                 }
             }
         }
         
     }
}

 

http://my.oschina.net/ososchina/blog/374050?p=1

转载于:https://www.cnblogs.com/manmanlu/p/4826018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android应用程序的自动更新可以通过以下步骤实现: 1. 在应用程序中添加版本检查功能,以检查当前应用程序版本是否为最新版本。 2. 如果当前应用程序版本不是最新版本,则从服务器下载最新版本的应用程序。 3. 下载完成后,使用Android的PackageInstaller API安装新版本的应用程序。 4. 在应用程序中添加后台服务,以定期检查新版本的应用程序是否可用,并在发现新版本自动下载和安装。 5. 在应用程序中添加设置选项,以允许用户选择是否启用自动更新功能,并设置更新检查的间间隔。 6. 在应用程序中添加通知功能,以通知用户新版本的应用程序已经下载并准备安装。 以上是Android应用程序自动更新的基本实现步骤。需要注意的是,在实现自动更新功能,需要确保应用程序的安全性和稳定性,并遵循Google Play Store的开发者政策和规定。 ### 回答2: Android应用自动更新功能对于用户来说是非常方便的,因为可以自动升级应用程序并不需要用户手动下载或更新应用。从开发人员的角度来看,自动更新也可以提高应用程序的可靠性和安全性。 实现Android应用的自动更新,一般需要应用程序具有以下特点: 1.应用程序需要有版本号:在应用程序中设置版本号,可以让应用程序知道当前的版本,从而实现更新。 2.应用程序需要能够获取服务器的最新版本号:一般是通过网络请求(HTTP请求接口)获取服务器的最新版本号。 3.应用程序需要将最新版本号与当前版本号进行比较:如果最新版本号大于当前版本号,则需要进行更新。 4.应用程序需要自动下载最新版本的APK文件:一般是通过下载管理器进行下载。 5.安装最新版本:通过调用系统的安装器来安装最新版本的APK文件。 在实现自动更新的过程中,需要做好以下几方面的工作: 1.确定应用程序的版本号,并与服务器上的版本号保持同步。 2.建立服务器端接口,提供应用程序的版本信息,以供客户端获取。 3.客户端获取最新版本信息后进行比较,根据比较结果决定是否需要更新。 4.下载最新版本的APK文件,并确保下载过程中不出现错误。 5.执行APK文件安装,并确保在安装过程中不出现错误。 总的来说,实现Android应用的自动更新需要对Android开发框架、网络通信、下载、存储、安装等方面有比较深入的了解,需要开发人员具备一定的技术实力。如果需要实现这个功能,可以参考Android开发文档、开源框架或网上的相关教程,以实现自动更新的功能。 ### 回答3: Android应用的自动更新是一种很重要的功能,可以方便地向用户推送新版本,并解决了用户手动更新应用的繁琐问题。下面将介绍如何实现Android app自动更新。 1. 获取新版本信息 首先,我们需要在应用服务器上存储最新版本的信息,包括版本号、版本名、更新说明、下载链接等。当用户打开应用,应用可以向服务器请求最新版本的信息。如果服务器返回的版本号大于当前应用版本号,就说明有新版本,需要更新。否则,应用继续运行。 2. 下载新版本apk 获取新版本信息后,应用需要下载最新版本的apk文件。一般情况下,我们会把apk文件上传到服务器,并返回下载链接。应用可以通过建立HTTP连接来下载apk文件,并保存到本地存储器。下载完毕后,应用需要获取文件头,获取apk文件的版本号和包名。 3. 安装新版本apk 下载完成后,应用需要自动打开安装新版应用。由于apk文件需要具有写操作权限才能被安装,因此需要在AndroidManifest.xml文件中添加读写文件权限。安装需要调用系统提供的安装接口来完成。调用语句如下: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); startActivity(intent); 其中,f是apk文件的File对象。开始安装后,系统会提示用户是否允许应用获取读写权限,如果用户没有允许,安装过程会中断。 4. 其他实现细节 为避免重复下载,可以在服务器端设定最新版本的HASH值,app检查是否有新版本的候通过HASH检查是否更新。 新版本需要提醒用户更改了什么,这就需要app在服务器端声明release notes,app通过检查新版本的主要变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值