Java lang illegalargumentexception service intent must be explicit intent

Service Intent must be explicit: Intent

Today, when writing a function of APP communication, there are some problems. The client is bound to the service side by aidl, which results in the collapse of the client terminal application. The initial code is written in this way.

@Override protected void onCreate(Bundle savedInstanceState) < . Intent intent = new Intent("com.example.wang.ordermanager.OrderService"); bindService(intent, conn, Context.BIND_AUTO_CREATE); >

The error log is as follows:

04-15 02:26:19.114 1747-1747/? E/uncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfocom.example.wang.client/com.example.wang.client.MainActivity>: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent < act=com.example.wang.ordermanager.OrderService > at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2444) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504) at android.app.ActivityThread.access$900(ActivityThread.java:165) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:5546) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent < act=com.example.wang.ordermanager.OrderService > at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1366) at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1465) at android.app.ContextImpl.bindService(ContextImpl.java:1443) at android.content.ContextWrapper.bindService(ContextWrapper.java:604) at com.example.wang.client.MainActivity.onCreate(MainActivity.java:68) at android.app.Activity.performCreate(Activity.java:6367) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2397) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504) at android.app.ActivityThread.access$900(ActivityThread.java:165) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:5546) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

With the source code, we found the following judgment in ContextImpl:

@Override public boolean bindService(Intent service, ServiceConnection conn, int flags) < warnIfCallingFromSystemProcess(); return bindServiceCommon(service, conn, flags, mMainThread.getHandler(), Process.myUserHandle()); > private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, Handler handler, UserHandle user) < . validateServiceIntent(service); . >private void validateServiceIntent(Intent service) < if (service.getComponent() == null && service.getPackage() == null) < if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) < IllegalArgumentException ex = new IllegalArgumentException( "Service Intent must be explicit: " + service); throw ex; > else < Log.w(TAG, "Implicit intents with startService are not safe: " + service + " " + Debug.getCallers(2, 3)); > > >

It can be seen that in Android5.0, the judgement of intent is added, because intent is obtained by setting action, so there is no instance of Component object and no package name, so it is wrong. Add a step of setting package name, can be solved smoothly, the code is as follows:

Intent intent = new Intent("com.example.wang.ordermanager.OrderService"); intent.setPackage("com.example.wang.ordermanager"); bindService(intent, conn, Context.BIND_AUTO_CREATE);

Posted by ank in Java at Apr 15, 2018 — 10:34 PM

Читайте также:  Java rest assured xml

Источник

неявный Intent для вызова Activity (Service) не работает в Android 5.1

Есть сервис и приложение реализованы разными проектами. в Android 4 все нормально работает. При получении смс или нажатии кнопки в приложении выполняется:

public void onClickStart(View v)

при startService(intent); запускается сервис, который выполняет нужные операции. Но при запуске на Android 5.1 приложение падает со следующей ошибкой.

 05-23 12:25:39.167 10539-10539/com.example.kir.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.kir.myapplication, PID: 10539 java.lang.IllegalStateException: Could not execute method of the activity at android.view.View$1.onClick(View.java:4074) at android.view.View.performClick(View.java:4848) at android.view.View$PerformClick.run(View.java:20262) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5637) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at android.view.View$1.onClick(View.java:4069) at android.view.View.performClick(View.java:4848) at android.view.View$PerformClick.run(View.java:20262) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5637) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent < act=com.example.kir.myapplication.service (has extras) >at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1801) at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1830) at android.app.ContextImpl.startService(ContextImpl.java:1814) at android.content.ContextWrapper.startService(ContextWrapper.java:516) at com.example.kir.myapplication.MainActivity.onClickStart(MainActivity.java:63) 

Ответы (1 шт):

Интент для запуска сервиса должен создаваться не так new Intent(«com.example.kir.myapplication.service») , а так new Intent(context, MyService.class) .

Вам об этом намекают в сообщении об ошибке «Service Intent must be explicit». То есть интент должен явно указывать какой сервис он запускает, а у вас создается интент с действием «com.example.kir.myapplication.service», которое теоретически может обрабатывать кто угодно.

Если вам нужно запустить сервис из другого приложения и соответственно вы не можете указать его класс, то можно сделать так:

new Intent().setComponent(new ComponentName(servicePackage, serviceClass)); 

где servicePackage это имя пакета приложения с сервисом, а serviceClass это соответственно полное имя класса сервиса.

Источник

Русские Блоги

Я столкнулся с проблемой при удаленном обслуживании фоновой службы Android (с использованием службы в режиме привязки):
05-04 11:25:10.656: E/AndroidRuntime(1393): java.lang.IllegalArgumentException: Service Intent must be explicit: Intent

Читайте также:  Java reflection get all field values

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

В учебнике андроида есть такой отрывок: Если служба и компонент, вызывающий службу, находятся в одном приложении, вы можете использовать явный запуск или неявный запуск; но если служба и компоненты, вызывающие службу, находятся в разных программах, вы можете использовать только неявный запуск. Итак, мой проект RemoteService использует неявный запуск, но сообщает об ошибке.

При поиске решений в Интернете я нашел причину: после Android 5.0 должен быть явно запущен Intent of Service. Говорят, что это сделано для того, чтобы несколько сервисов не использовали один и тот же фильтр намерения.

Решение такое:
Если служба неявно объявлена ​​в AndroidManifest.xml,
Метод 1:
Задайте действие и имя пакета:
Справочный код выглядит следующим образом:
Intent mIntent = new Intent();
mIntent.setAction («XXX.XXX.XXX»); // Действие определенной вами службы
mIntent.setPackage (getPackageName ()); // Здесь вам нужно установить имя пакета вашего приложения
context.startService(mIntent);
Метод 2:
Как устранить предупреждение в Android 5.0: служебное намерение должно быть объяснено
Подобные проблемы не рекомендуются

/ * Мои сомнения: 1. Есть ли такое требование к методу привязки: использовать явное неявное для одного и того же процесса и разных процессов
2. Может ли удаленная служба использовать режим запуска для непосредственного отображения службы?
3. Используйте службу для метода привязки, потому что мое решение предназначено для решения, когда служба была неявно объявлена ​​в AndroidManifest.xml, поэтому может ли тип привязки удаленной службы быть прямым? Отображение с использованием службы (конфигурация отображения в AndroidManifest.xml) * /

Подведем итоги: текущее использование сервиса не совсем точно в учебных материалах.
(сторона службы и клиент, упомянутые ниже, находятся в одной программе для локальных вызовов, а в разных программах для удаленных служб они похожи)
Метод запуска:

service android:name=".RandomService"/>
Intent serviceIntent = new Intent(this, RandomService.class); startService(serviceIntent);
service android:name=".RandomService"> intent-filter> action android:name="edu.hrbeu.SimpleRandomServiceDemo.RandomService"/> intent-filter> service>
Intent serviceIntent=new Intent(); serviceIntent.setAction("com.example.remoteservicedemo.RemoteService"); serviceIntent.setPackage("com.example.remoteservicedemo"); startService(serviceIntent); // Мне нужно написать неявный запуск после android5.0

Метод привязки:
похож на метод запуска, но метод bindService () используется в соответствующей позиции

service android:name=".MathService"/>
Intent serviceIntent = new Intent(SimpleMathServiceDemoActivity.this,MathService.class); bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);

Неявная привязка, подробно писать не буду

  • Краткий синтаксис Markdown и расширенный Markdown
  • Выделение блока кода
  • Ссылка на изображение и загрузка изображения
  • LaTexМатематическая формула
  • Диаграммы последовательности UML и блок-схемы
  • Ведение блога офлайн
  • Импорт и экспорт файлов Markdown
  • Богатые сочетания клавиш
Читайте также:  Actionlistener method in java

горячая клавиша

  • Смелый Ctrl + B
  • Курсив Ctrl + I
  • Цитата Ctrl + Q
  • Вставить ссылку Ctrl + L
  • Код вставки Ctrl + K
  • Вставить картинку Ctrl + G
  • Повысить титул Ctrl + H
  • Заказанный список Ctrl + O
  • Неупорядоченный список Ctrl + U
  • Горизонтальная линия Ctrl + R
  • Отозвать Ctrl + Z
  • Повторить Ctrl + Y

Уценка и расширение

Markdown — это легкий язык разметки, который позволяет людям писать документы в текстовом формате, который легко читать и писать, а затем преобразовывать их в полноформатные HTML-страницы. —— [Википедия]

Используйте простые символы для обозначения различных заголовков и помечайте определенный текст какСмелыйиликурсивный,Создайтессылка на сайтПодождите, пожалуйста, обратитесь к справке за подробной грамматикой? ,

Этот редактор поддерживаетMarkdown Extra , Многие полезные функции были расширены. Пожалуйста, обратитесь кGithub.

форма

Markdown ExtraСинтаксис формы:

проект цена
Computer $1600
Phone $12
Pipe $1

Вы можете использовать двоеточие для определения выравнивания:

проект цена Количество
Computer 1600 юаней 5
Phone 12 юаней 12
Pipe 1 юань 234

Список определений

Markdown ExtraСинтаксис списка определений: Пункт 1 Пункт 2 Определение А Определение Б Пункт 3 Определение C

Блок кода

Синтаксис блока кода соответствует стандартному коду уценки, например:

@requires_authorization def somefunc(param1='', param2=0): '''A docstring''' if param1 > param2: # interesting print 'Greater' return (param2 - param1 + 1) or None class SomeClass: pass >>> message = '''interpreter . prompt'''

сноска

оглавление

использовать

Чтобы создать каталог:

Математическая формула

Рендеринг с MathJaxLaTex Математическая формула, см.math.stackexchange.com.

  • Встроенная формула, математическая формула: Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N 。
  • Формула блочного уровня:

Дополнительную информацию о синтаксисе LaTex см. ВВот.

Диаграмма UML:

Вы можете визуализировать диаграммы последовательности:

Источник

Оцените статью