Android 从应用程序上下文启动活动

Posted

技术标签:

【中文标题】Android 从应用程序上下文启动活动【英文标题】:Android Starting Activities from Application Context 【发布时间】:2014-07-03 18:05:47 【问题描述】:

我正在尝试从扩展应用程序的类开始活动。我可以使用FLAG_NEW_ACTIVITY_TASK 作为创建活动的标志意图来做到这一点。

让我举例说明我正在尝试实现的场景。

有两个用户 USER1 和 USER2。如果 USER1 按下按钮(HOLD),则会在 USER2 的设备上创建一个新活动。在 USER2 的设备上启动新活动是由扩展 Application 的类完成的。然后,当 USER1 按下按钮(UNHOLD)时,我希望 USER2 的设备显示上一个活动。我能够调出上一个活动,但由于 FLAG_NEW_ACTIVITY_TASK 标志正在重新创建它,我希望恢复该活动而不是重新创建。

我被困在这里,我在谷歌上搜索过,但不明白我该怎么做。请帮忙。

清单:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

 <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
 <uses-feature android:name="android.hardware.telephony" android:required="false" />
 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>   


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name=".MyApplication" >

    <service android:name=".PortSipService"></service>
    <service android:name=".Ringback"></service>

    <service android:name=".LocationService"></service>
    <activity 
        android:name=".MainActivity"
        android:label="@string/app_name">
        <intent-filter >
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity android:name=".SaveContacts" android:label="@string/app_name"> </activity>
    <activity android:name=".IncomingCall" android:label="@string/app_name"> </activity>
    <activity android:name=".ContactActivity" android:label="@string/app_name"></activity>
    <activity android:name=".CallConnected" android:label="@string/app_name"></activity>
    <activity android:name=".OutgoingCall" android:label="@string/app_name"></activity>
    <activity android:name=".MusicPlayer" android:label="@string/app_name"></activity>
</application>

这是暂停时,

Intent music = new Intent(getApplicationContext(),MusicPlayer.class);                          music.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(music);

这是当松开按下时,

    Intent connect = new Intent(getApplicationContext(),CallConnected.class);
    connect.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    getApplicationContext().startActivity(connect);

我不希望重新创建这个 callconnected 活动,但这是因为意图标志。

【问题讨论】:

发布您的清单和用于启动活动的代码 听起来你需要为不同的活动指定不同的taskAffinity。尝试在CallConnected 活动上设置android:taskAffinity="" @DavidWasser,我认为它有点工作,我仍然无法在此处进行通信,但当按下 unhold 时,可能是服务器问题。我认为它正在工作,因为我在屏幕上有一个计时器,当我切换活动时它仍在运行。我正在学习android,我阅读了taskAffinity,然后使用了它。所以当你说我将它分配给 CallConnected 活动时,我做了 android:taskAffinity=".CallConnected"。我做对了吗?如果是这样的话,我几乎没有遇到任何问题,因为它稍微干扰了我的活动流程。 您需要更好地解释您的申请,以便我为您提供帮助。你有多少任务?预期的活动流程是多少? 场景 1:IncomingCall-->CallConnected 如果点击应答。如果 USER1 在 CallConnected 中单击保持另一个屏幕出现在 USER2,如果 USER1 单击取消保持旧的 CallConnected 屏幕应该出现。场景 2:IncomingCall-->CallConnected-->HoldActivity 出现在 USER2 屏幕上,如果 USER1 单击保持传入屏幕,如果 USER1 点击 unhold 屏幕出现。希望这会帮助你我正在尝试做的事情。 【参考方案1】:

您可以尝试像这样使用 Activity 而不是 Context:

Intent music = new Intent(MainActivity.this,MusicPlayer.class);
music.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MainActivity.this.startActivity(music);

【讨论】:

以上是关于Android 从应用程序上下文启动活动的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义意图操作仅在特定应用程序上下文中启动活动

如何从 android 活动启动 Unity 应用程序?

Android:从应用程序类启动新活动

如果上下文不是活动上下文而是应用程序上下文,如何启动 Intent

从 Android 应用安装程序和主屏幕启动应用程序时的活动堆栈排序问题

Java 代码没有在 Android Studio 中启动新活动?和上下文有关吗?