【问题标题】:having issues with starting an activity using Intent使用 Intent 启动活动时遇到问题
【发布时间】:2014-05-07 11:13:25
【问题描述】:

我对如何让该功能正常工作感到沮丧。 我一直在研究和环顾 Intent。

起初我以为我是对的,但我错了,对我的意思的一些概述。 我制作了一个有 6 个按钮的应用程序,所有这些按钮都可以打开不同的应用程序。

  1. 时钟、2. 日历、3. 浏览器、4. 消息、5. 电话和 6. 联系人。

这是我启动联系人应用程序的 onClick 方法。

// Contacts Launch
Button contacts_launch = (Button) findViewById(R.id.contacts_launch); 
contacts_launch.setOnClickListener(new View.OnClickListener() { 

 @Override
 public void onClick(View v) {
       Intent intent_contacts = new Intent(Intent.ACTION_MAIN);
       intent_contacts.addCategory(Intent.CATEGORY_LAUNCHER);
       startActivity(intent_contacts);
  }
});

我所有按钮的 onClick Intent 方法都是一样的,只是根据应用程序名称更改了 Intent 名称,例如消息传递是 intent_message。

启动应用程序时以及点击按钮时。它提示我一个窗口,我可以在其中选择应用程序。每次我选择按钮时它都会运行应用程序。

但是当我选择另一个应用程序时,它会启动联系人应用程序?并且不让我像以前那样选择它。我怎样才能解决这个问题?我很确定我用错了意图函数。

感谢您的宝贵时间。

请再次检查代码,那是我修改过的一个不起作用的那个,它只有一个意图方法。我在让我选择的地方添加了我最初使用的代码。那就是具有意图和类别的那个。 (你现在能看到的那个)

【问题讨论】:

  • 你想显式调用那个页面
  • 我以前就是这样做的,但我认为如果用户可以选择他们启动的内容会更好,因为当我将该方法作为显式 Intent 调用时,它只会启动一个应用程序,如果不是它崩溃了,我不擅长过滤东西。
  • 在每个按钮单击上显式调用该页面。它将完美运行
  • 使用 Intent.createChooser 的意图,其动作设置为 ACTION_MAIN
  • @pskink 我这样做了 Intent intent_contacts = new Intent(Intent.ACTION_MAIN); startActivity(Intent.createChooser(intent_contacts, "查看联系人"));有效,但它也列出了许多随机应用程序和活动,但有什么方法可以让它设置为默认值吗?所以我不必一直选择?

标签: java android class android-intent


【解决方案1】:

如果你不想一遍又一遍地选择 Activity(比如使用 createChooser 时)试试这个:

public class Chooser extends Activity implements OnClickListener {
    private static final int NUM = 6;
    private static final CharSequence DEFAULT = "click for select the app, long click to clear it";

    private Intent[] mIntents = new Intent[NUM];
    private LinearLayout mLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLayout = new LinearLayout(this);
        mLayout.setOrientation(LinearLayout.VERTICAL);
        for (int i = 0; i < NUM; i++) {
            Button b = new Button(this);
            b.setTag(i);
            b.setText(DEFAULT);
            b.setOnClickListener(this);
            registerForContextMenu(b);
            mLayout.addView(b);
        }
        setContentView(mLayout);
    }

    private CharSequence getName(Intent intent) {
        PackageManager mgr = getPackageManager();
        ResolveInfo info = mgr.resolveActivity(intent, 0);
        if (info != null) {
            return info.loadLabel(mgr);
        }
        return intent.getComponent().getShortClassName();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        int itemId = (Integer) v.getTag();
        if (mIntents[itemId] != null) {
            menu.add(Menu.NONE, itemId, Menu.NONE, "Clear");
        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int i = item.getItemId();
        Button b = (Button) mLayout.getChildAt(i);
        b.setText(DEFAULT);
        mIntents[i] = null;
        return super.onContextItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Button b = (Button) mLayout.getChildAt(requestCode);
            b.setText(getName(data));
            mIntents[requestCode] = data;
            startActivity(data);
        }
    }

    @Override
    public void onClick(View v) {
        int i = (Integer) v.getTag();
        if (mIntents[i] == null) {
            Intent intent = new Intent(Intent.ACTION_PICK_ACTIVITY);
            Intent filter = new Intent(Intent.ACTION_MAIN);
            filter.addCategory(Intent.CATEGORY_LAUNCHER);
            intent.putExtra(Intent.EXTRA_INTENT, filter);
            startActivityForResult(intent, i);
        } else {
            startActivity(mIntents[i]);
        }
    }
}

【讨论】:

  • 什么不清楚?它只有不到 100 行代码,大部分是与 ui 相关的,所以真正的事情是为结果启动活动
  • 谢谢,但它不会保存活动。它会打开,当你回到那里但当你回到主要活动然后再次单击按钮时它会重置。
  • 当然:您必须将其保存在某个地方,请参阅 Intent.toUri 和 Intent.getIntent 方法
【解决方案2】:

嗨,使用下面的代码打开联系人:

 @SuppressWarnings("deprecation")
 Intent intent = new Intent(Intent.ACTION_PICK, People.CONTENT_URI);
 startActivity(intent);

【讨论】:

    【解决方案3】:
    Intent sendIntent = new Intent(Intent.ACTION_VIEW);
    sendIntent.setData(Uri.parse("sms:"));
    sendIntent.putExtra("sms_body", urlToShare);
    startActivity(sendIntent);
    

    这是打开消息应用程序或环聊的示例代码。你也可以为其他人这样做。

    【讨论】:

    • 这会打开OEM消息应用程序吗?喜欢 xperia 吗?
    • 我没有在 xperia 中测试过。但我认为它会开始
    • 另外,我怎样才能让它启动其他应用程序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多