精华内容
下载资源
问答
  • 安卓多任务切换
    千次阅读
    2017-11-07 17:16:05

    就是点击手机多任务键的效果,上下翻滚,点击选择,侧滑删除效果。
    https://github.com/vikramkakkar/DeckView

    更多相关内容
  • 《Switchr》是一款Android上的多任务切换软件,使用了它之后你会发现曾经的多任务切换方式都弱掉了。《Switchr》的有着出色的设计,界面美观,能够以类似iPod上的CoverFlow封面流动效果来进行多任务的切换。效果非常...

    Android设备都会有专用的按钮来查看和切换多任务列表,例如通过长按Home键来实现。现在切换多任务有了更炫的方式。《Switchr》是一款Android上的多任务切换软件,使用了它之后你会发现曾经的多任务切换方式都弱掉了。

    《Switchr》的有着出色的设计,界面美观,能够以类似iPod上的CoverFlow封面流动效果来进行多任务的切换。效果非常炫目,令人爱不释手。

    e520f55509bbe5443f1ef6089f7fd21a.gif

    软件的使用并不难,安装后几乎不需要进行任何的设定就可以开始使用了。用户只需要用手从屏幕左侧边缘扫过,就能触发《Switchr》,此时手机中已经在后台运行的各种软件就会出现在屏幕中,通过左右移动来选择需要打开的应用即可。

    并且在任何程序下都可以完成多任务切换,无论是你正在进行何种操作都不会影响软件的使用。相比通过长按Home键来呼出多任务菜单这种传统的方式,Switchr的确十分便捷。

    a072c395bf5a0ba5fbca491d400a62a7.gif

    下面来简单的介绍一下软件的设置。Switchr包含了两种切换样式,一种是iPod的CoverFlow风格,而另一种是类似Windows 8的风格,在软件安装后会要求用户来进行一个选择,建议使用手机用户尽量CoverFlow,能提供较好的使用体验。

    在常规设置中,可以对基础的启动、位置等进行设置;不过重点设置却是第二个Switchr设置项,在这里你不仅可以选择样式,更可以对CoverFlow效果进行调整,通过对背景、图标大小、淡化和缩放效果的调节打造出最适合自己的样式。

    9514c811b69d2b1b7e9997b48903a33b.gif

    (各个选项切换也包含特效)

    c790457c8c7bf8111683c56a3882f735.gif

    Switchr的功能其实并不仅限于各个应用之间的切换,通过手势操作还可实现关闭应用的功能。对于初次上手的用户,在从屏幕左侧划入来触发软件的时候并不能每次都成功,多用几次习惯了软件的特性之后这种情况会改善。

    展开全文
  • 理论基础我们知道,task是用户为了完成某个功能而执行的一系列操作所...但我们知道,android的task只是针对任务的,也就是说同一个task中的Activity对象可以来自不同的进程。问题当然,在大多数情况下,我们是因为应...

    理论基础

    我们知道,task是用户为了完成某个功能而执行的一系列操作所形成的一个Activity序列。

    一般情况下,一个应用启动的Activity对象都处于同一个task中(task id 相同),也处于同一个进程中(process id 相同)。但我们知道,android的task只是针对任务的,也就是说同一个task中的Activity对象可以来自不同的进程。

    问题

    当然,在大多数情况下,我们是因为应用要调用到其它产品的功能,才会把一些非本应用的Activity调起来。此时,会产生同一个task中的Activity对象可以来自不同的进程的情形。

    那么问题来了,在什么样的情况下,我们需要在同一个task中(单个应用,不涉及调用其它应用的产品)使用不同的进程来启动自己应用中的Activity呢?比如下面这种情形:

    u0_a888 1248 460 2140048 54060 ffffffff 00000000 S com.test.multiprocesstest

    u0_a888 1784 460 2136872 51704 ffffffff 00000000 S com.test.multiprocesstest:process1

    u0_a888 1909 460 2136924 52848 ffffffff 00000000 S com.test.multiprocesstest:process2

    u0_a888 2012 460 2156528 50864 ffffffff 00000000 S com.test.multiprocesstest:process3

    其中每个进程对应一个不同的Activity。可能的情况有:

    此应用的单个Activity需要使用相对比较大的内存

    此应用有可能需要处理相对独立的多个文档

    此应用的Activity的关闭动作需要非常迅速的完成

    比如,一个应用需要同时打开几个非常消耗内存的文档,同时又需要在这几个文档中来回切换,还需要关闭文档不能有迟钝。

    因为,对于每个进程最多能使用多少内存,每台机器都是不同的,具体可以通过查看:/system/build.prop文件中的dalvik.vm.heapgrowthlimit项即可:

    shell@PD1602:/system $ cat build.prop | grep heap

    ...

    dalvik.vm.heapgrowthlimit=256m

    ...

    上述这台设备是256m,单个process如果使用内存超过这个数量,就会抛出OOM异常。

    还有,如果关闭Activity时需要等待线程结束,释放对象模型等等的操作,可能会占用一定的时间,此时Activity就无法立即销毁。

    解决方案

    在以上这种情形下,使用单任务单进程,达到要求就比较费劲。所以,我们可以在一个应用中尝试使用单任务多进程来解决这个问题。

    具体实现思路其实很简单:

    在工程中创建多个Activity,比如Activity1,Activity2,Activity3等。在Manifest中设置每个Activity对应的进程名,比如:

    android:name=".Activity1"

    android:process=":process1">

    android:name=".Activity2"

    android:process=":process2">

    android:name=".Activity3"

    android:process=":process3">

    这样每次startActivity的时候,系统就会启动指定的进程,此Activity创建的所有对象均运行在此进程中。我们要做的就是按正常流程逐个启动Activity,当被定义的Activity全部被启动后如果再要启动新的Activity,那就需要先通知Task最底层的Activity对象finish,并关闭对应进程(可以使用System.exit(0))。同时,关闭后空出来的Activity可以重新使用。

    举例:

    假设Activity1、Activity2、Activity3都是同一的功能,都用来打开同一种类型的文件。当我逐个启动了Activity1、Activity2、Activity3后,Task中最顶层的是Activity3,最底层的是Activity1。此时,如果我需要再打开一个文件,那么我可以通知Activity1自行关闭,而后再创建一个Activity1压在Activity3上面,以此类推。

    106e3355b3eb

    示意图

    由于这些Activity处于不同的进程中,所以无法使用Application来维护管理它们,所以在这里我选择了AIDL作为进程间通讯的工具。

    关于AIDL双向通讯的具体使用,可参考其它文档,此处只给出简单的示例代码:

    定义的管理器AIDL以及用于回调的AIDL:

    // IActivityManagerCallback.aidl

    package com.test.multiprocesstest;

    interface IActivityManagerCallback {

    void managerFinish();

    }

    // IActivityManager.aidl

    package com.test.multiprocesstest;

    import com.test.multiprocesstest.IActivityManagerCallback;

    interface IActivityManager {

    //activity code 放入管理器

    void putActivity(int activityCode);

    //得到需要被启动的 activity 的 code(比如:1、2、3)

    int getActivityCodeTobeStarted();

    //注册(反注册)回调

    boolean registerCallback(IActivityManagerCallback cb, int code);

    boolean unregisterCallback(IActivityManagerCallback cb);

    }

    管理器Manifest定义:

    android:name=".ActivityManagerService"

    android:enabled="true"

    android:exported="true">

    管理器部分代码:

    public class ActivityManagerService extends Service

    {

    public static final int ACTIVITY_SIZE = 3;

    private LinkedList mActivityCodeList = new LinkedList<>();

    private RemoteCallbackList mCallBack = new RemoteCallbackList<>();

    @Override

    public IBinder onBind(Intent intent)

    {

    return new ManagerBinder();

    }

    class ManagerBinder extends IActivityManager.Stub

    {

    @Override

    public void putActivity(int activityCode) throws RemoteException

    {

    mActivityCodeList.add(activityCode);

    }

    @Override

    public int getActivityCodeTobeStarted() throws RemoteException

    {

    if (mActivityCodeList.size() < ACTIVITY_SIZE)

    {

    return mActivityCodeList.size() + 1;

    }

    //移出最底层 activity 的 code

    int rmCode = mActivityCodeList.removeFirst();

    //通知对应的 activity 关闭

    int len = mCallBack.beginBroadcast();

    for (int i = 0; i < len; i++)

    {

    if ((Integer)mCallBack.getBroadcastCookie(i) == rmCode)

    {

    mCallBack.getBroadcastItem(i).managerFinish();

    break;

    }

    }

    mCallBack.finishBroadcast();

    return rmCode;

    }

    @Override

    public boolean registerCallback(IActivityManagerCallback cb, int code) throws RemoteException

    {

    return mCallBack.register(cb, code); //code is cookie

    }

    @Override

    public boolean unregisterCallback(IActivityManagerCallback cb) throws RemoteException

    {

    return mCallBack.unregister(cb);

    }

    }

    }

    Activity1的代码(Activity2、Activity3都是继承于Activity1)

    package com.test.multiprocesstest;

    import android.content.ComponentName;

    import android.content.Context;

    import android.content.Intent;

    import android.content.ServiceConnection;

    import android.os.Handler;

    import android.os.IBinder;

    import android.os.RemoteException;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.Button;

    import android.widget.TextView;

    public class Activity1 extends AppCompatActivity

    {

    protected int mActivityCode = 1;

    private Button mBtnGetMainActivity;

    private Context mContext;

    private Handler mHandler = new Handler();

    private boolean mIsBind = false;

    private boolean mIsRegisterCallback = false;

    private IActivityManager mManagerService = null;

    //服务回调

    private IActivityManagerCallback mManagerCallback = new IActivityManagerCallback.Stub()

    {

    @Override

    public void managerFinish() throws RemoteException

    {

    System.out.println("managerFinish Activity" + mActivityCode);

    //管理器要求关闭此 activity

    mHandler.post(new Runnable()

    {

    @Override

    public void run()

    {

    finish();

    }

    });

    }

    };

    private ServiceConnection mConnection = new ServiceConnection()

    {

    @Override

    public void onServiceConnected(ComponentName name, IBinder service)

    {

    mManagerService = IActivityManager.Stub.asInterface(service);

    //与服务连接后,需要注册回调

    if (!mIsRegisterCallback)

    {

    try

    {

    mIsRegisterCallback = mManagerService

    .registerCallback(mManagerCallback, mActivityCode);

    }

    catch (RemoteException e)

    {

    e.printStackTrace();

    }

    }

    try

    {

    mManagerService.putActivity(mActivityCode);

    }

    catch (RemoteException e)

    {

    e.printStackTrace();

    }

    }

    @Override

    public void onServiceDisconnected(ComponentName name)

    {

    mManagerService = null;

    }

    };

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_01);

    mContext = this;

    System.out.println("pid = " + android.os.Process.myPid() + ", task id = " + getTaskId());

    mBtnGetMainActivity = (Button) findViewById(R.id.get_main_activity);

    mBtnGetMainActivity.setOnClickListener(new View.OnClickListener()

    {

    @Override

    public void onClick(View v)

    {

    Intent intent = new Intent(mContext, MainActivity.class);

    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    startActivity(intent);

    }

    });

    Intent intent = new Intent();

    intent.setAction("com.multiprocess.aidl.activitymanager"); //manifest.xml中定义

    intent.setPackage("com.test.multiprocesstest");

    if (!mIsBind)

    {

    mIsBind = bindService(intent, mConnection, BIND_AUTO_CREATE);

    }

    TextView text = (TextView) findViewById(R.id.text);

    text.setText("Activity" + Integer.toString(mActivityCode));

    }

    @Override

    protected void onDestroy()

    {

    if (mIsRegisterCallback)

    {

    try

    {

    mIsRegisterCallback = mManagerService.unregisterCallback(mManagerCallback);

    }

    catch (RemoteException e)

    {

    e.printStackTrace();

    }

    }

    if (mIsBind)

    {

    unbindService(mConnection);

    }

    super.onDestroy();

    System.exit(0);

    }

    }

    异常处理

    假设某个Activity自身发生崩溃,而我们的Service却无法得知,则会导致重新使用此Activity时发生ANR。所以我们希望Activity在发生崩溃时能通知Service或者Service能够以某种方式来检测Activity是否发生崩溃。

    方法1:

    在启动Activity时,调用AIDL方法,给Service传入一个IBinder对象,然后监听这个binder的死亡回调,例如:

    private class Client implements IBinder.DeathRecipient

    {

    private IBinder binder;

    private int code;

    public Client(IBinder binder, int activityCode)

    {

    this.binder = binder;

    this.code = activityCode;

    try

    {

    this.binder.linkToDeath(this, 0);

    }

    catch (RemoteException e)

    {

    e.printStackTrace();

    }

    }

    @Override

    public void binderDied()

    {

    //说明对应code的Activity对象已经崩溃,需要处理...

    }

    }

    此时,Service的

    putActivity(int activityCode);

    方法就要改成

    putActivity(Client client);

    方法2:

    方法1在某种程度上可以让Service得知Activity崩溃的情况,而很多ANR的异常时无法立即通知Service的。此时,我们可以通过调用AIDL的方法,故意让Activity去做一些UI线程上的操作,如果出现异常,则认为Activity已经崩溃。

    多任务(Task)

    多任务和单任务区别不大,只是在StartActivity的时候添加两个Flags:

    intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);

    注意:使用这种方式,manifest中必须设置 android:launchMode="standard" 属性值(默认就是这个属性)

    使用这种做法,每启动一个任务,就会在近期使用列表中添加一个记录,用户可以在这些记录间切换使用(ps:此方法不一定适用每个android版本,亲测7.0可用)

    后台Activity切换到前台

    单任务多进程

    Class> cls;

    //比如:cls = Activity1.class;

    Intent intent = new Intent(context, cls);

    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    startActivity(intent);

    多任务多进程

    ActivityManager manager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);

    manager.moveTaskToFront(taskID, ActivityManager.MOVE_TASK_WITH_HOME);

    //taskID是Activity所在task的id

    展开全文
  • 相信大家一定都使用过手机QQ和微信之类的软件,当我们使用时不难发现其界面的切换不仅可以通过点击页标签来实现,还可以通过左右滑动来实现的,下面小编给大家介绍下如何实现这个功能
  • 我们知道,线程是Android开发中必现的场景,很原生API和开源项目都有线程的内容,这里简单总结和探讨一下常见的线程切换方式。 我们先回顾一下Java线程的几个基础内容,然后再分析总结一些经典代码中对于...
  • android 9支持用户切换吗?消息说是支持的呢Android中的APP如何实现帐号切换?这个并不难,你可以同时在服务器的数据库中关联一个主键下的个账户,每一个账户都有唯一的主键,用主键可以便利所有的账户,在...

    android 9支持多用户切换吗?

    消息说是支持的呢

    Android中的APP如何实现多帐号切换?

    这个并不难,你可以同时在服务器的数据库中关联一个主键下的多个账户,每一个账户都有唯一的主键,用主键可以便利所有的账户,在客户端便可以实现时时切换。

    华为P9多用户模式怎么用?

    在手机“设置”里,点击“用户”进入多用户管理界面哦。然后你可以选择添加用户或者切换用户或者授权用户使用电话、信息及共享通讯记录哦。1。如果是添加用户,点击“添加”或“添加访客”,并按照屏幕提示添加子用户或访客用户。添加用户后,在锁屏界面上会出现一个人的头像的突变哦。而锁屏界面显示的用户即为当前登录的用户哦。2.如果是切换用户,点击要登录的用户,在弹出的菜单中点击“切换用户”。您也可以在锁屏界面,点击头像哦,然后点击想要登录的用户就ok了哦。3如果.授权用户使用电话、信息及共享通讯记录,以机主身份登录时,可以对子用户及访客进行授权。点击要授权的用户,在弹出的菜单中点击“允许使用通话和信息并共享通讯记录”。获得授权后,该用户就可以使用电话和短信功能了哦,还可以与主机共享通话记录和短信哟。如果机主对多个子用户进行授权,被授权的子用户之间也可以共享通话记录和短信的哦。

    华为Mate9多用户模式怎么开启?

    若您的手机上已经添加了多个用户,您可以选择切换为要使用的用户。A.从状态栏向下滑动,点击用户图标,选择用户头像或用户名可直接切换到该用户。B.打开【设置 】&gt 【高级设置】 &gt【 用户】,选择要切换的用户,然后点击【切换用户】。

    如何自动进入多用户模式?

    linux操作系统。方法/步骤 首先我打开linux进入到界面。然后在右击桌面在打开终端。在终端里输入init 1回车。这里就是root管理用户了,这里只对root使用主机,其它得都不得。回车之后可以看到如下图sh-3.00#这里就是root模式了。可以输入命令ls看到如下图配置文件,在这里是可以进行维护的。如果想回到图形界面的话可以输入init 5在回车键。回车键之后可以看到了正在启动。启动完后就可以进入图形界面了。

    安卓5.0中存储空间互相独立的多用户模式怎么用?

    在安卓5.0中与之前的版本不同的是, Android 5.0 Lollipop 的多用户模式是存储空间相互独立的,每个用户都有独立的存储空间。在你创建新用户时,会进入引导界面,是的,就像一部新手机一样。当然,这种模式对手机的存储容量是一个考验,所以新的 Nexus 设备都是 32GB 起。多用户之间切换无需重启,也不会花费很长时间。  除此之外还有访客模式。访客模式下用户的所有数据(通讯录,短信,应用等)会被隐藏,访客只能查看和使用手机的基本功能,另外你还可以设置访客是否有接听电话权限。  综合来看这个功能对于平板来说非常实用,尤其是家庭公用的平板电脑,可以保证自己的信息安全,同时在访客访问时也有一定的隐私保护作用。

    什么是多用户系统?什么是单用户系统?

    单用户单任务操作系统:只允许登陆的用户是一个,同时只可以远行一个程序 多任务多用户操作系统:允许多个用户使用,同时可以远行多个程序。 例如:WIN98是一个单用户多任务操作系统 WIN2000/XP是一个多任务多用户操作系统

    华为P9多用户模式是什么?如何使用多用户模式?

    1、直接在桌面上滑就进入全局搜索,输入闹钟就能找到

    2、或者下拉通知栏,点击当前时间就可以进入闹钟

    展开全文
  • 仿iOS9多任务切换的卡片流。.zip,MXCardLayout reproduces the behavior seen in iOS9's multitasking switcher.
  • Android前后台任务切换

    2020-09-24 19:32:31
    一、判断APP是否在前台运行 public static boolean isRunningForeground(Context context) { ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);...
  • 在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。 我们都知道,一个Activity 可以启动另一个Activity,即使这个Activity是定义在别一个应用程序里的,比如说,想要给用户展示一个地图的信息,...
  • Android任务

    2021-06-10 03:34:15
    android:allowTaskReparenting:如果一个email启动了一...android:clearTaskOnLaunch="true":如果A启动了B,再切换到home,点击图标(Lauch)切换回来,显示A,把A以上的任务栈清除了。android:finishOnTaskLanch="tr...
  • 1三大平板系统 谁能"左右互搏"?喜欢看金庸的网友都知道,“左手画方,右手画圆”的左右互搏术是武学至高境界,只有...下面,笔者将对比iOS、Android和Windows RT三款平板系统的多任务模式,看看这三大高手在多任...
  • 安卓APP内部语言切换

    千次阅读 2019-07-18 20:42:40
    曾见过有人反射手机系统的设置来实现语言,但是网上使用最多的方案还是提供一套语言的string.xml文件,手动切换app内部实现。这里我们也随大流动手搞一下。 要点 0、预览图 1、实现思路 (1)准备语言的...
  • ViewPager就是一个简单的页面切换组件,我们可以往里面填充个View,然后我们可以左右滑动,从而切换不同的View,我们可以通过setPageTransformer()方法为我们的ViewPager> 设置切换时的动画效果。和ListView,...
  • 近期在做一个背单词APP来作为毕业设计,在app里面想设计一个切换语言为英语的功能,记录一下本次实现的效果以及步骤。
  • 如题,这种效果类似微信小程序显示的效果,就是打开微信跳一跳后,切换安卓多任务窗口(就是清理内存窗口),会看到如下页面 多任务图1.jpg 微信小程序会在其中显示两个单独的页面,点击跳一跳会进入跳一跳小程序...
  • 点击上方“电脑爱好者”关注我们不知道童鞋们有没有留意一个问题,Android手机似乎到现在也没有对虚拟按键的设计达成统一意见,如果频繁更换手机会很不适应。作为Android的“老子”,谷歌对这个现象也没有太好的办法...
  • 今天小编就为大家分享一篇关于Android使用ViewPager快速切换Fragment时卡顿的优化方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 主要为大家详细介绍了Android实现带页面切换的锁屏功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Android断点续载,下载进度通知,下载失败重试3次,下载任务切换。非完整项目代码,包含所有关键代码供参考
  • Android任务栈机制详解

    2022-03-31 17:36:26
    首先,我们知道,android任务栈机制,启动任务栈的方式有xml中配置,还有就是通过intent设置flag去启动相应的activity。这里我们分三部分来介绍 1.xml配置的几种方式详解 2.intent flag启动的几种方式详解 3.flag ...
  • 二、实验任务 1.根据原型图设计界面; 2.实现Tab切换; 三、实验内容与要求 3.1界面设计: (1)使用线性布局实现界面的基本布局; (2)使用不同的Tab实现方式实现tab的布局。 3.2 Tab切换 (1)监听Tab...
  • Android 将后台应用切换到前台

    千次阅读 2021-01-07 10:46:25
    } }else { /**获得当前运行的task(任务)*/ List taskInfoList = activityManager.getRunningTasks(100); for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) { /**找到本应用的 task,并将它切换到...
  • 前一阵想要给APP做一个进入后台时弹窗的效果,使用的是对基类base的生命周期进行监听,过程有点差强人意,因此今天单独写一个对APP切换到后台以及切换到前台的依赖(AppFrontBackHelper),以便以后使用到的话直接引用...
  • 安卓系统本身目前并不自带这种功能,那么有没其他方法可以实现呢?现在小编就告诉你,有!下面就为你讲解如何使用手机软件实现定时自动切换情景模式。1、下载安装“金山电池医生”并打开应用,点击“模式”界面。2、...
  • C51的多任务程序

    2013-03-26 12:40:01
    该文件可以教你如何学会在C程序中写个子程序,这是一个简单易懂的非常经典的例子
  • 在 Android 还没出生,我们使用 Windows 时,总巴不得把所有没有用到的进程关掉,这样才不会“占 内存”,不会“占 CPU ”,电脑才不会“卡”。(大部分的“安全软件”就是靠帮用户在 Windows 上清内存,清...
  • Android进阶知识(六):Activity启动模式进阶之多任务栈与Flags 一、Activity启动模式进阶之多任务栈 在笔记Android基础知识(三):Android四大组件简介中曾经提到过,Android系统是一个多任务的操作系统,而任务...
  • 在很久以前,曾经遇到过一个问题,就是在按任务键的时候,启动的个Activity居然同时出现在任务管理器中,当时非常的困惑,还因为是启动模式设置错了,就把launchMode改为为singleTask,后来发现,根本就不是启动...
  • Android Studio个项目窗口怎么切换?

    千次阅读 2021-06-05 10:57:47
    但是很多人不知道如何切换窗口,那么,这里教大家如何窗口切换,下面我们就来看看详细的教程。1、打开AndroidStudio。2、我们这里默认打开了上次编辑的项目“HelloWorld”,我们再开一个项目:点击顶部菜单栏...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,995
精华内容 21,598
关键字:

安卓多任务切换