我目前在Android中有一个服务,它是一个示例VOIP客户端,因此它会侦听SIP消息,如果它收到一个,它会启动一个带有UI组件的活动屏幕.
然后,以下SIP消息确定要在屏幕上显示活动的内容.例如,如果它的来电将显示接听或拒绝或拨出电话,它将显示拨号屏幕.
在那一刻,我使用Intents让Activity知道它应该显示的状态.
一个例子如下:
Intent i = new Intent();
i.setAction(SIPEngine.SIP_TRYING_INTENT);
i.putExtra("com.net.INCOMING", true);
sendBroadcast(i);
Intent x = new Intent();
x.setAction(CallManager.SIP_INCOMING_CALL_INTENT);
sendBroadcast(x);
Log.d("INTENT SENT", "INTENT SENT INCOMING CALL AFTER PROCESSINVITE");
Run Code Online (Sandbox Code Playgroud)
因此,活动将为这些意图注册广播接收器,并根据收到的最后意图切换其状态.
示例代码如下:
SipCallListener = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(SIPEngine.SIP_RINGING_INTENT.equals(action)){
Log.d("cda ", "Got RINGING action SIPENGINE");
ringingSetup();
}
if(CallManager.SIP_INCOMING_CALL_INTENT.equals(action)){
Log.d("cda ", "Got PHONE RINGING action");
incomingCallSetup();
}
}
};
IntentFilter filter = new IntentFilter(CallManager.SIP_INCOMING_CALL_INTENT);
filter.addAction(CallManager.SIP_RINGING_CALL_INTENT);
registerReceiver(SipCallListener, filter);
Run Code Online (Sandbox Code Playgroud)
这可行,但它似乎不是非常有效,Intents将获得广播系统范围和Intents必须为不同状态触发似乎它可能变得低效,我必须包括更多,以及增加复杂性.
所以我想知道是否有更高效,更清洁的方法来做到这一点?
有没有办法让Intents只在应用程序内部广播?
回调是一个更好的主意吗?如果是这样,为什么以及以何种方式实施它们?
我想在我的Android应用程序上打开电子邮件应用程序:以下代码崩溃我做错了什么?请提供代码
Intent i = new Intent (Intent.ACTION_SEND,Uri.fromParts("mailto", "testemail@gmail.com", null));
this.startActivity(i);
Run Code Online (Sandbox Code Playgroud) 我希望使用自定义操作在我的应用中启动活动.我找到了一些答案,但我尝试的所有内容都会java.lang.RuntimeException说没有找到任何活动来处理Intent {act = com.example.foo.bar.YOUR_ACTION}.
这是我的清单文件中的活动:
<activity
android:name=".FeedbackActivity" >
<intent-filter>
<action android:name="com.example.foo.bar.YOUR_ACTION" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
这就是我开始活动的方式:
Intent intent = new Intent("com.example.foo.bar.YOUR_ACTION");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
这是将字符串添加到Extras的方式:
Intent i = new Intent();
i.putExtra("Name", edt_name.getText());
i.putExtra("Description", edt_desc.getText());
i.putExtra("Priority", skb_prior.getProgress());
setResult(RESULT_OK, i);
finish();
Run Code Online (Sandbox Code Playgroud)
这是我尝试提取它们的方式onActivityResult():
String name = data.getStringExtra("Name");
String desc = data.getStringExtra("Description");
int prior = data.getIntExtra("Priority", 50);
Run Code Online (Sandbox Code Playgroud)
但第二个代码块后name和desc是null的,虽然prior有它应有的价值.此外,在调试器中,我可以看到,它data.mExtras.mMap包含所需的字符串,但仅在第一次请求之后.
我在这里有一个简单的webview活动,加载后它会自动显示正在进行的通知.我们的想法是,人们可以远离此活动,并通过下拉菜单并选择它,从他们想要的任何屏幕再次快速访问它.然后,当他们想要时,他们可以通过点击菜单按钮并点击退出来关闭通知,然后清除通知.一切正常.但是,当按下通知时,它会启动活动的新实例.我需要更改什么才能看到活动是否尚未被销毁,我可以回调用该实例(恢复它),因此不需要再次加载它,也不需要在我的堆栈中添加其他活动.有任何想法吗?任何帮助将不胜感激.
package com.my.app;
import com.flurry.android.FlurryAgent;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.webkit.CookieSyncManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class Chat extends Activity {
private ProgressDialog progressBar;
public WebView webview;
private static final String TAG = "Main";
private NotificationManager mNotificationManager;
private int SIMPLE_NOTFICATION_ID;
@Override
public void onStart() {
super.onStart();
CookieSyncManager.getInstance().sync();
FlurryAgent.onStartSession(this, "H9QGMRC46IPXB43GYWU1");
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); …Run Code Online (Sandbox Code Playgroud) resume notifications android android-intent android-activity
我想将一个新的但不同的Intent传递给一个Activity.你如何区分新的Intent和之前的Intent?onNewIntent()中有什么样的代码?一个例子将非常有用.
嗨,我有以下代码:
@RunWith(Test9Runner.class)
public class MainActivityTest
{
private MainActivity activity;
private Button pressMeButton;
@Before
public void setUp() throws Exception
{
activity = new MainActivity();
activity.onCreate(null);
pressMeButton = (Button) activity.findViewById(R.id.button1);
}
@Test
public void shouldUpdateResultsWhenButtonIsClicked() throws Exception
{
pressMeButton.performClick();
ShadowActivity shadowActivity = shadowOf(activity);
Intent intent = shadowActivity.getResultIntent();
System.out.print(intent.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何测试压力按下的MeButton开始了一个新的活动.实际上确实如此,但是如何为这个事实编写正确的Robolectric单元测试呢?
我在我的应用程序中有两个活动,一个是启动器,另一个是从第一个启动的显式调用.
这里我的问题是,当我通过从第二个活动按下主页键返回主屏幕并启动应用程序时,即使第二个活动已经在后台,第一个活动也会启动.
编写第一个Activity是为了下载应用程序工作所需的资产,一旦下载资产,它就会触发第二个活动并调用自我完成.
以下是我的应用程序清单.
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<! Download the Required Assets if not found on SD Card -->
<activity android:name=".ContentDownload"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|locale"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".ActualAppActivity"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|locale"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true"
/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<supports-screens android:smallScreens="false" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"/>
Run Code Online (Sandbox Code Playgroud)
有人可以指导我如何使第二个活动直接获得控制,而不是在调用启动器并且它在后台时再次通过第一个活动.
下面是我的onResult回拨方法. …
如何使用ADB命令在android中重置工厂?我曾使用adb reboot recovery命令来重置.但第三方应用程序无法以某种方式被清除.这是否正确使用ADB?
实际上,我想通过java代码重置工厂重置android设备.这里可以解决什么问题?
我正在创建一个可以通过谷歌下载的启动器(自助服务终端)应用程序.首次安装此应用程序时,用户可以选择哪个启动器(我的或库存)将是默认设置.如果用户没有将我的应用程序设置为默认启动器,我试图手动启动它.当对话框出现时,我希望用户强制选择ALWAYS而不是JUST ONCE,否则对话框将继续定期显示友好消息.这是我到目前为止所尝试的.
我创建了一个方法来检查我的应用程序是否是默认的
/**
* method checks to see if app is currently set as default launcher
* @return boolean true means currently set as default, otherwise false
*/
private boolean isMyAppLauncherDefault() {
final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
List<IntentFilter> filters = new ArrayList<IntentFilter>();
filters.add(filter);
final String myPackageName = getPackageName();
List<ComponentName> activities = new ArrayList<ComponentName>();
final PackageManager packageManager = (PackageManager) getPackageManager();
packageManager.getPreferredActivities(filters, activities, null);
for (ComponentName activity : activities) {
if (myPackageName.equals(activity.getPackageName())) {
return true;
}
}
return false; …Run Code Online (Sandbox Code Playgroud) android ×10
android-intent ×10
email ×1
extras ×1
launcher ×1
null ×1
performance ×1
resume ×1
robolectric ×1
service ×1
string ×1