淡然一笑而过 發表於 2022-11-9 09:54:00

Android Launcher页面最近任务开发

<p>1、需要导入Framework.jar</p>
<p>2、AS会报错但是能编译成功,想让MainActivity中的代码正常编译运行,就需要修改依赖模块AndroidSDK和framework.jar的先后顺序,只要让framework.jar加载的优先级高于AndroidSDK。参考此文章:Android开发之依赖framework.jar包引用系统隐藏的属性和方法_AFinalStone的博客-CSDN博客</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>/**<br> * 通过FrameWork层获取最近任务<br> * @return a list of the recents tasks.<br> */<br>public static List&lt;ActivityManager.RecentTaskInfo&gt; getRecentTasks(int numTasks, int userId) {<br>    try {<br>      return ActivityManager.getService().getRecentTasks(numTasks,<br>                RECENT_IGNORE_UNAVAILABLE, userId).getList();<br>    } catch (RemoteException e) {<br>      Log.e(TAG, "Failed to get recent tasks", e);<br>      return new ArrayList&lt;&gt;();<br>    }<br>}<br><br></pre>
<pre>/**<br> * 获取最近任务列表具体信息<br> * @param context<br> * @return返回最近任务列表<br> */</pre>
<pre>@RequiresApi(api =<span style="color: rgba(0, 0, 0, 1)"> Build.VERSION_CODES.M)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> List&lt;AppInfoBean&gt; get(Context context,<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> numTasks) {
    List</span>&lt;AppInfoBean&gt; list = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
    </span><span style="color: rgba(0, 0, 255, 1)">final</span> PackageManager pm =<span style="color: rgba(0, 0, 0, 1)"> context.getPackageManager();

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此方法要调用Framework层的方法,获取最近任务列表</span>
    List&lt;ActivityManager.RecentTaskInfo&gt; recents =<span style="color: rgba(0, 0, 0, 1)"> getRecentTasks(numTasks,
            UserHandle.myUserId());
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i &lt; recents.size(); i++<span style="color: rgba(0, 0, 0, 1)">) {

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过RecentTaskInfo转换ResolveInfo 获取包名、应用名、icon</span>
            <span style="color: rgba(0, 0, 255, 1)">final</span> ActivityManager.RecentTaskInfo info =<span style="color: rgba(0, 0, 0, 1)"> recents.get(i);
            Intent intent </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Intent(info.baseIntent);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (info.origActivity != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                intent.setComponent(info.origActivity);
            }
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这句话我暂时还不时很清晰</span>
            intent.setFlags((intent.getFlags() &amp; ~<span style="color: rgba(0, 0, 0, 1)">Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
                  </span>|<span style="color: rgba(0, 0, 0, 1)"> Intent.FLAG_ACTIVITY_NEW_TASK);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取指定应用程序activity的信息</span>
            <span style="color: rgba(0, 0, 255, 1)">final</span> ResolveInfo resolveInfo = pm.resolveActivity(intent, 0<span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">屏蔽不显示的应用</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> (resolveInfo != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(0, 0, 255, 1)">final</span> ActivityInfo activityInfo =<span style="color: rgba(0, 0, 0, 1)"> resolveInfo.activityInfo;
                </span><span style="color: rgba(0, 0, 255, 1)">final</span> String title =<span style="color: rgba(0, 0, 0, 1)"> activityInfo.loadLabel(pm).toString();
                </span><span style="color: rgba(0, 0, 255, 1)">final</span> String pkName =<span style="color: rgba(0, 0, 0, 1)"> resolveInfo.activityInfo.packageName;
            
                AppInfoBean infoBean </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AppInfoBean();
                Drawable icon </span>=<span style="color: rgba(0, 0, 0, 1)"> activityInfo.loadIcon(pm);
                infoBean.setAppIcon(icon);
                infoBean.setAppName(title);
                infoBean.setPkgName(pkName);
                list.add(infoBean);
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> list;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
      e.printStackTrace();
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}<br><br></span></pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">App信息类
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> AppInfoBea {   
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String appName;   
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Drawable appIcon;   
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String pkgName ;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getAppName() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> appName;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setAppName(String appName) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.appName =<span style="color: rgba(0, 0, 0, 1)"> appName;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Drawable getAppIcon() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> appIcon;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setAppIcon(Drawable appIcon) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.appIcon =<span style="color: rgba(0, 0, 0, 1)"> appIcon;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getPkgName() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> pkgName;
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setPkgName(String pkgName) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.pkgName =<span style="color: rgba(0, 0, 0, 1)"> pkgName;
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String toString() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> "AppInfoBean{" +
                "appName='" + appName + '\'' +
                ", pkgName='" + pkgName + '\'' +'}'<span style="color: rgba(0, 0, 0, 1)">;
    }
}<br><br></span></pre>
</div>
<div class="cnblogs_code">
<pre></pre>
<pre>有可能获取最近任务列表是个耗时的操作所以写了一个异步类来获取数据<br>public class MyAsyncTask extends AsyncTask&lt;String, String, List&lt;AppInfoBean&gt;&gt; {<br><br>    private Context mContext;<br>    private List&lt;AppInfoBean&gt; mData;<br>    private OnResponseListener&lt;List&lt;AppInfoBean&gt;&gt; listener;<br><br><br>    public MyAsyncTask(Context context) {<br>      mContext = context;<br>    }<br><br>    @RequiresApi(api = Build.VERSION_CODES.M)<br>    @Override<br>    protected List&lt;AppInfoBean&gt; doInBackground(String... strings) {<br>      mData = AppsUtil.get(mContext,10);<br>      Log.d("task", "doInBackground: "+mData.size());<br>      return mData;<br>    }<br><br>    @Override<br>    protected void onPostExecute(List&lt;AppInfoBean&gt; appInfoBeans) {<br>      super.onPostExecute(appInfoBeans);<br>      if (listener != null) {<br>            listener.onResponse(appInfoBeans);<br>      }<br><br>    }<br><br>    public void setListener(OnResponseListener&lt;List&lt;AppInfoBean&gt;&gt; listener) {<br>      this.listener = listener;<br>    }<br><br>    //定义回调接口<br>    public interface OnResponseListener&lt;T&gt; {<br>      void onResponse(T t);<br>    }<br><br>}</pre>
<pre><span style="color: rgba(0, 0, 0, 1)"><br><br>最后在你可以在activity的onResume()来执行这一步操作,这样每次打开主页都是最新的任务列表。但是每次可见的时候都要重新获取数据,消耗内存,暂时没想到更好的方法,也希望各路大神指点。
@Override
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onResume() {
  MyAsyncTask myAsyncTask</span>=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyAsyncTask(context);
  myAsyncTask.setListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span> MyAsyncTask.OnResponseListener&lt;List&lt;AppInfoBean&gt;&gt;<span style="color: rgba(0, 0, 0, 1)">() {
      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onResponse(List&lt;AppInfoBean&gt;<span style="color: rgba(0, 0, 0, 1)"> appInfoBeans) {
        Log.d(</span>"task", "onResponse: "<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在这里初始化你的recycleview的adapter</span>
<span style="color: rgba(0, 0, 0, 1)">      
      }
  });
  myAsyncTask.execute();
}</span></pre>
</div>
<pre></pre><br><br>
来源:https://www.cnblogs.com/mhzf/p/16870603.html
頁: [1]
查看完整版本: Android Launcher页面最近任务开发