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 从应用程序上下文启动活动的主要内容,如果未能解决你的问题,请参考以下文章
如果上下文不是活动上下文而是应用程序上下文,如何启动 Intent