标签: android-intent

从Service更新UI的方式比意图更有效?

我目前在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只在应用程序内部广播?

回调是一个更好的主意吗?如果是这样,为什么以及以何种方式实施它们?

performance service user-interface android android-intent

41
推荐指数
1
解决办法
2万
查看次数

Android - 打开电子邮件应用程序?

我想在我的Android应用程序上打开电子邮件应用程序:以下代码崩溃我做错了什么?请提供代码

Intent i = new Intent (Intent.ACTION_SEND,Uri.fromParts("mailto", "testemail@gmail.com", null));
this.startActivity(i);
Run Code Online (Sandbox Code Playgroud)

email android android-intent android-activity

40
推荐指数
2
解决办法
3万
查看次数

使用自定义操作启动活动

我希望使用自定义操作在我的应用中启动活动.我找到了一些答案,但我尝试的所有内容都会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)

任何帮助将不胜感激.

android android-intent android-activity

40
推荐指数
2
解决办法
5万
查看次数

Android Intent.getStringExtra()返回null

这是将字符串添加到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)

但第二个代码块后namedescnull的,虽然prior有它应有的价值.此外,在调试器中,我可以看到,它data.mExtras.mMap包含所需的字符串,但仅在第一次请求之后.

string null android extras android-intent

40
推荐指数
1
解决办法
6万
查看次数

如何使通知意图恢复而不是制定新的意图?

我在这里有一个简单的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

39
推荐指数
3
解决办法
5万
查看次数

如何在onNewIntent()中捕获新的Intent?

我想将一个新的但不同的Intent传递给一个Activity.你如何区分新的Intent和之前的Intent?onNewIntent()中有什么样的代码?一个例子将非常有用.

android android-intent

39
推荐指数
3
解决办法
6万
查看次数

测试该按钮以Robolectric启动Activity

嗨,我有以下代码:

@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单元测试呢?

android android-intent robolectric android-activity

39
推荐指数
4
解决办法
2万
查看次数

恢复Top Activity而不是启动Launcher Activity

我在我的应用程序中有两个活动,一个是启动器,另一个是从第一个启动的显式调用.

这里我的问题是,当我通过从第二个活动按下主页键返回主屏幕并启动应用程序时,即使第二个活动已经在后台,第一个活动也会启动.

编写第一个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回拨方法. …

android android-manifest android-intent android-activity

39
推荐指数
3
解决办法
3万
查看次数

如何在android中使用adb进行出厂重置?

如何使用ADB命令在android中重置工厂?我曾使用adb reboot recovery命令来重置.但第三方应用程序无法以某种方式被清除.这是否正确使用ADB?

实际上,我想通过java代码重置工厂重置android设备.这里可以解决什么问题?

android android-widget android-emulator android-intent

39
推荐指数
4
解决办法
18万
查看次数

如何以编程方式设置默认应用启动器?

我正在创建一个可以通过谷歌下载的启动器(自助服务终端)应用程序.首次安装此应用程序时,用户可以选择哪个启动器(我的或库存)将是默认设置.如果用户没有将我的应用程序设置为默认启动器,我试图手动启动它.当对话框出现时,我希望用户强制选择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 launcher android-intent

39
推荐指数
3
解决办法
4万
查看次数