android某一app设为焦点app

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android某一app设为焦点app相关的知识,希望对你有一定的参考价值。

参考技术A 在做电视机顶盒应用的时候,每个控件都是有焦点变化的显示的,如果当前焦点被一个自己不知道的控件获取到,则其他控件就不会获取到焦点,我们必须要找到当前获取焦点的控件,将其 android:focusable="false" ,不让它获取到焦点。

通过findFocus()方法来获取到当前的控件。

在Activity的onCreate方法中,启动线程。

new Thread(run2).start();

run2的代码如下所示:

Runnable run2 = new Runnable()
@Override

public void run()
while (true)
try
Thread.sleep(5000);

catch (InterruptedException e)
e.printStackTrace();



View rootview = DetailActivity.this.getWindow().getDecorView();

View aaa = rootview.findFocus();

Log.i("tag", aaa.toString());





;

这样每隔5秒会获取一次当前有焦点的控件,打印出log就可以了。

打印出的log如下所示:

最后就是控件的id了,这样你就找到了当前获取焦点的控件了。

结束。

链接:https://www.waimaiguai.com/technology/article/1327504
来源:外卖怪
参考技术B 第一种方式,代码设置,注意先后顺序: btn.setFocusable(true);btn.setFocusableInTouchMode(true);btn.requestFocus();btn.requestFocusFromTouch();
2. 第二种方式,xml配置: android:focusable="true

Android基础知识-1

1、Android的Activity任务栈

        在Android的系统中,在APP运行时每个APP都会默认有一个任务栈,任务栈的名称以APP的包名命名。任务栈是一中先进后出的结构,APP中每一个调用的Activity均会按照先后顺序进栈,处于焦点下的Activity处于任务栈的栈顶。

    当用户按back键时,栈内的Activities会按照先后顺序出栈,并调用该Activity的OnDestroy方法。如果栈内已经没有元素时,系统会回收该APP的任务栈。

 

     在Activity的的xml标签中,可以定义每个Activity的模式。不同的模式在任务栈中调用时的表现也是不同的:        

  • standard模式:标准模式。在该模式下,每次启动的Activity都会创建一个实例将其压入任务栈中,不管此时该Activity是否已经存在。
  • singleTop模式:栈顶复用模式。如果当前启动的Activity此时恰好处于任务栈栈顶的位置,那么就会复用该Activity。此时不会重新执行Activity的OnCreate、OnStart和OnResume方法,但是会执行OnNewIntent()方法。如果该Activity不在栈顶位置,则与standard模式一样。
  • singleTask模式:栈内复用模式。比较霸道的一种模式,当Activity启动时会判断当前栈内是否已经存在。如果不存在,先创建该Activity实例并将其压入任务栈内。如果存在,则会将该Activity上面的所有Activity清除掉,将该Activity调到栈顶位置,调用OnNewIntent方法。
  • singleInstance模式:加强版的singleTask模式,这个模式下的Activity处于一个单独的任务栈内,除非所在的任务栈被销毁,否则不会创建新的Activity。

     

        Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放在一个List里面.可以认为一个ActivityRecord就是一个Activity任务栈。

 

2、Activity的缓存

        为什么要有Activity的缓存?举个栗子:当应用从Activity A进入到Activity B后的一段时间后,A的资源被系统回收。当你从B按back键要回到A时,前一次A的数据和状态都已经丢失,此时不会执行A的OnRestart方法,而是重新执行了A

   的OnCreate方法。    So,Activity的缓存就有了存在的价值。

        Activity有一个封装好的方法:onSaveInstanceState() 。当Activity被销毁之前,该方法会被回调用以保存Activity的状态和数据。该方法有个Bundle参数,方法中可以使用putString() 、putInt()方法保存需要保存的参数。在Activity启动调用

   OnCreate方法时,也有一个Bundle参数,该参数就是上次Activity销毁时保存下来的数据。

      那么有哪些场景会触发onSaveInstanceState()方法呢?答案是非用户主动销毁的动作那么该方法就都会被调用。

  • 用户按HOME键的动作
  • 切换到其他应用
  • 灭屏时
  • 从当前的Activity进入另一个Activity
  • 如果不设定configchange属性,屏幕横竖屏切换也会,因为横竖屏切换时系统会先销毁当前Activity,然后在切换后再重新创建。   

       还有一些细节知识:

  1. UI布局中的每一个View都默认实现了onSaveInstanceState()方法,这意味着UI界面的每一个改动都会被存储并在Activity重建时恢复。这有一个前提,那就是这个UI界面需要一个ID,如果没有ID,前面的实现都不会被调用。
  2. onSaveInstanceState()方法调用有不确定性,只能用这个方法去记录activity的瞬间状态(UI的状态)。不能用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()方法中存储持久化数据(例如应该被存储到数据库中的数据)。
  3. onSaveInstanceState()如果被调用,那么一定是在onStop()前被触发,但每次不一定是在onPause()之前或者之后触发。

 

      明天继续~

以上是关于android某一app设为焦点app的主要内容,如果未能解决你的问题,请参考以下文章

在Android开发中如何移除EditText上的输入焦点

Android TV开发焦点移动源码分析

Qt设置某一窗口获取不到焦点,或者焦点一直在某一窗口上

案例:Input事件有焦点App无焦点窗口

Android音频焦点申请处理

Android移动应用中的焦点分析