当前位置: 首页 > 知识库问答 >
问题:

如何从后台以编程方式恢复Android活动

高宇定
2023-03-14

情况:

  1. 比如说,我目前正在开展应用程序活动A。
  2. 过了一段时间,我按下了“主页”按钮。应用程序A进入后台
  3. 现在,我开始使用另一个应用程序B——例如youtube等。
  4. 在应用程序A中发生了一些事情(不管在这种情况下发生了什么,比方说计时器完成了计算时间),目前它被最小化到后台
  5. 事件发生时,应用程序A活动会自动从后台恢复

问题:

如何完成第5步?基本上,我需要知道如何以编程方式从后台恢复应用程序。

我试图启动意图以“重启”我的应用程序活动,但没有成功:

Intent intent = new Intent(context, MainActivity.class);
            intent.setAction(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            context.startActivity(intent);

我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.taxti"
    android:versionCode="43"
    android:versionName="1.5.3" >     

    <uses-sdk
        android:minSdkVersion="13"
        android:targetSdkVersion="21" />

    <permission
        android:name="com.example.taxti.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <uses-permission android:name="com.example.taxti.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />       
    <permission android:name="com.taxti.permission.C2D_MESSAGE"
                android:protectionLevel="signature" />
    <uses-permission android:name="com.taxti.permission.C2D_MESSAGE" />     
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />   
    <uses-permission android:name="android.permission.CALL_PHONE" />  
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
    <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />

    <application
        android:allowBackup="true"        
        android:icon="@drawable/ic_launcher"
        android:hardwareAccelerated="true"
        android:label="@string/app_name"
        android:name="com.taxti.Globals"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.taxti.InitialActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustPan"
            android:screenOrientation="sensorLandscape"
            android:theme="@style/MyTheme" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.taxti.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustPan"
            android:screenOrientation="sensorLandscape"
            android:theme="@style/MyTheme">
        </activity>

        <service android:name=".MainActivityForegroundService" />

        <intent-filter>
                <action android:name="android.net`enter code here`.conn.CONNECTIVITY_CHANGE" />                
        </intent-filter>

       <intent-filter>
            <action android:name="android.intent.action.CALL_PRIVILEGED" />
            <category android:name="android.intent.category.DEFAULT" />     
            <action android:name="android.intent.action.DIAL" />
            <action android:name="android.intent.action.CALL_BUTTON" />     
            <category android:name="android.intent.category.BROWSABLE" />           
            <data android:scheme="tel" />
       </intent-filter>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="xxxx" />             
        <uses-library android:name="com.google.android.maps" />

        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >   
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />               
                <category android:name="com.taxti" />
            </intent-filter>

        </receiver>

    </application>

</manifest>

共有3个答案

常翰
2023-03-14

以编程方式从后台恢复应用程序

将您的活动置于前台,用户当前的活动置于后台。用户的工作不见了

从用户的角度来看,这不是正确的行为。此外,如果我们以编程方式恢复活动,活动生命周期将被打破。活动状态将丢失。

备选方案:

当计时器、任务(任何事情)在后台完成时,您可以提供通知。如果用户对检查您的活动感兴趣,那么他/她可以在不中断当前工作的情况下通过通知进行检查

章振
2023-03-14

如果您的活动在不同的任务上,您可以使用它将活动的任务放在前台:

ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); 
activityManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION);

您需要android.permission.REORDER_TASKS才能做到这一点。它甚至可以在Android M中运行,但是在某些情况下从服务中获取意图效果更好。

寿嘉悦
2023-03-14

为了让你的应用进入前台,你必须从另一个上下文调用startActivity()(一个服务或一个广播接收器)。仅仅在活动中调用startActivity(),不会让你的应用程序出现在前台。

您不需要Intent中的ACTION和CATEGORY,但您确实需要设置Intent.FLAG_ACTIVITY_NEW_TASK

 类似资料:
  • 问题内容: 情况: 假设我目前正在启动应用程序ActivityA。 一段时间后,我按“主页”按钮。应用程序A进入后台。 目前,我开始使用其他应用B-例如youtube等。 在当前最小化到后台的应用程序A中发生了某些事情(在这种情况下无关紧要,例如计时器完成了计算时间)。 在事件发生时,应用程序A活动将自动从后台恢复。 题: 如何完成步骤5?基本上,我需要知道如何以编程方式从后台恢复应用程序。 我试

  • 每当我最初创建我的活动时,一切都很顺利,因为我能够正确地膨胀我的布局。但是,问题是每当我切换到使用另一个应用程序,然后返回我自己的应用程序时,我都会收到一个错误,说为空,导致我的应用程序崩溃。如果我切换到另一个应用程序几分钟,我的为空,也会导致我的应用程序崩溃。 如果我对Android生命周期的理解正确的话,我意识到活动是在从后台到前台的时候被重新创建的,而< code>onCreate方法是从这

  • 我有一个包含例如一个按钮的片段,我想允许包含该片段的活动更改此按钮视图,例如颜色和标题或src图像。最好的方法是什么? 更新:如果我不够清楚,很抱歉,但我希望活动可以随心所欲地更改整个视图,比如设置填充、颜色或任何东西。它将以编程方式创建视图,片段应该用新视图替换旧视图,并更改视图的ID,以便片段代码不受影响。如果我在片段中创建了获取这些视图的方法,那么主活动应该在什么时候调用它们?因为活动必须等

  • 问题内容: 我直接使用默认的os拨号器通过以下方式创建呼叫: 是否可以直接从我的应用程序启动Skype? 我尝试传递一个数字,如下所示: 传递数字失败。 问题答案: 您需要知道Skype软件包名称(例如com.skype.android),然后才能启动它:

  • 我有一个充满自定义视图的应用程序。当我尝试以编程方式创建FAB时,它会抛出一个错误 原因:java.lang.IllegalArgumentException:您需要在设计库中使用theme.AppCompat主题(或后代)。

  • 我正在构建一个android应用程序,我需要从后台开始一项活动。我正在使用ForegroundStarter来扩展服务,以实现这一点。我有一个活动屏幕。我需要从前台服务运行的类。活动的广告屏幕。除了Android10,其他所有Android版本的课程都可以正常运行(从后台开始)。 前场先发。班 我读到在Android10上从后台启动活动有一些限制。这个代码似乎不再有效了。https://devel