Явное намерение Android с целевым компонентом - PullRequest
19 голосов
/ 26 июля 2011

Можно ли вызвать явное намерение, но не для действия из моего проекта, а для действия в каком-то другом приложении.

Я уверен в этом коде и знаю, что он работает

Intent i=new Intent(this,MyActivity.class);

Но возможно ли сделать что-то подобное

Intent i=new Intent(this,com.bzz.bla.bla.SomeActivity.class);

Я имею в виду, каков точный способ явного запуска активности из другого приложения (активность, которая содержится в других apk), это вообще возможно?

Я пытался, но это заставляет меня закрыть сообщение.

Ответы [ 5 ]

36 голосов
/ 26 июля 2011

Да, это возможно. Но создание намерений другое. Попробуйте это:

Intent intent = new Intent();
intent.setComponent(new ComponentName("The package name of the activity that you wish to launch","Its fully qualified class name"));
startActivityForResult(intent);
7 голосов
/ 26 июля 2011

Да, это возможно.Но создание намерений немного отличается.

Intent intent = new Intent();
intent.setComponent(new ComponentName("The package name of the activity that you wish to launch","Its fully qualified class name"));
startActivity(intent);

Но тогда вы просто не сможете вызвать какую-либо активность любого случайного приложения.У этого конкретного действия должен быть фильтр намерений с основным действием.

3 голосов
/ 19 августа 2014

Вы можете запустить любой компонент с намерением только знать имя действия или целевого компонента (pkg, cls).
Учтите, что я разработал два приложения app1 & app2 app1 имя pkg - com.xyz.app1 & app2 pkg namecom.xyz.app2.

app1 с двумя действиями App1MainActivity & App1XyzActivity, app2 имеет только одно действие App2MainActivity теперь я хочу запустить оба действияиз app1 из app2 App2MainActivity
app2 App2MainActivity имеет две кнопки b1 и b2 при нажатии b1 Я хочу запустить App1MainActivity и при нажатии b2 Я хочу начатьApp1XyzActivity тогда код для кнопок b1 и b2 в App2MainActivity равен

b1.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {


        Intent i = new Intent();
        String pkg = "com.xyz.app1";
        String cls = "com.xyz.app1.App1MainActivity";
        i.setComponent(new ComponentName(pkg, cls));
        App2MainActivity.this.startActivity(i);

    }
});

b2.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {


        Intent i = new Intent();
        String pkg = "com.xyz.app1";
        String cls = "com.xyz.app1.App1XyzActivity";
        i.setComponent(new ComponentName(pkg, cls));
        App2MainActivity.this.startActivity(i);

    }
});

, теперь я устанавливаю оба приложения app1 и app2 и запускаю app2.
Когда я нажимаю на кнопку b1, app1 App1MainActivityначать, но если я нажму на кнопку b2, произойдет исключение, причина в том, что мы не можем случайным образом запустить любое действие другого приложения, даже если вы знаете имя пакета и имя его класса, но вы можете запустить основное действие другого приложенияесли он имеет намеренный фильтр с действием MAIN и если вы знаете его имя пакета и имя класса.

1 голос
/ 13 февраля 2017

Я бы предложил объединить имя пакета и класса точкой;

это ускоряет копирование и вставку, например.при написании тестов jUnit.

String packageName = getApplicationContext().getPackageName();
String className = "SomeActivity";

Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, packageName + "." + className));
startActivity(intent);
0 голосов
/ 25 мая 2016
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("np.birthday.com.order", "np.birthday.com.order.MainActivity");// intent.setClassName("Package NAme of another application", "np.birthday.com.order.MainActivity");
startActivity(intent);
...