Service - запуск из другого приложения

Ответить
Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Service - запуск из другого приложения

Сообщение Pavel-Pugach » 16 апр 2015, 18:58

Попытался сделать урок #94, но не могу никак запустить сервис из другого приложения.

На AVD 5.0+ валится с ошибкой. Попробовал запустить на 4.4 - приложение уже не вылает, но выдает "Implicit intents with startService are not safe: Intent { act=ru.startandroid.develop.p0942servicekillserver.MyService (has extras) } android.content.ContextWrapper.startService:494 com.example.pavel.ololosh.MainActivity.onClickStart:19 java.lang.reflect.Method.invokeNative:-2". На AVD 4.0.3 - вообще при клике на кнопку ничего не происходит.

Работаю из под Android Studio. В уроке сказано первым установить на AVD сервис, но вместо установки он у меня просто запускается и проганяется. А из другого application не запускается. Ниже код:

MyService:

Код: Выделить всё

public class MyService extends Service {
    final String LOG_TAG = "myLogs";

    public void onCreate() {
        super.onCreate();
        Log.d(LOG_TAG, "MyService onCreate");
    }

    public void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "MyService onDestroy");
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(LOG_TAG, "MyService onStartCommand");
        readFlags(flags);
        MyRun mr = new MyRun(startId);
        new Thread(mr).start();
        return START_NOT_STICKY;
    }

    public IBinder onBind(Intent arg0) {
        return null;
    }

    void readFlags(int flags) {
        if ((flags&START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY)
            Log.d(LOG_TAG, "START_FLAG_REDELIVERY");
        if ((flags&START_FLAG_RETRY) == START_FLAG_RETRY)
            Log.d(LOG_TAG, "START_FLAG_RETRY");
    }

    class MyRun implements Runnable {

        int startId;

        public MyRun(int startId) {
            this.startId = startId;
            Log.d(LOG_TAG, "MyRun#" + startId + " create");
        }

        public void run() {
            Log.d(LOG_TAG, "MyRun#" + startId + " start");
            try {
                TimeUnit.SECONDS.sleep(15);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            stop();
        }

        void stop() {
            Log.d(LOG_TAG, "MyRun#" + startId + " end, stopSelfResult("
                    + startId + ") = " + stopSelfResult(startId));
        }
    }
}
Manifest.xml - service:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pavel.servicekillserver" >

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" >
        <service android:name=".MyService">
            <intent-filter>
                <action android:name="ru.startandroid.develop.p0942servicekillserver.MyService"/>
            </intent-filter>
        </service>
    </application>

</manifest>
MainActivity application:

Код: Выделить всё

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onClickStart(View v) {
        Toast.makeText(this, "click", Toast.LENGTH_SHORT).show();
        startService(new Intent("ru.startandroid.develop.p0942servicekillserver.MyService").putExtra("name", "value"));
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Что я делаю не так?) Или в версии 4.0+ нельзя стартовать сервисы из других апликейшенов? Или я просто стартую не правильно? В обсуждении урока много подобных вопросов, но ни одного ответа.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Service - запуск из другого приложения

Сообщение klblk » 17 апр 2015, 07:12

попробуй в манифесте у сервиса прописать: android:exported="true"
ну и у любой ошибки должны быть логи.

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Service - запуск из другого приложения

Сообщение Pavel-Pugach » 17 апр 2015, 10:10

Exported = "true" прописал, не помогает. Логи забыл сбросить... Вот они:

Для AVD 4.4.2:

Код: Выделить всё

04-17 02:56:19.783    1899-1899/com.example.pavel.ololosh D/﹕ HostConnection::get() New Host Connection established 0xb8ad3220, tid 1899
04-17 02:56:19.873    1899-1899/com.example.pavel.ololosh W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-17 02:56:19.903    1899-1899/com.example.pavel.ololosh D/OpenGLRenderer﹕ Enabling debug mode 0
04-17 02:56:39.943    1899-1899/com.example.pavel.ololosh W/ContextImpl﹕ Implicit intents with startService are not safe: Intent { act=ru.startandroid.develop.p0942servicekillserver.MyService (has extras) } android.content.ContextWrapper.startService:494 com.example.pavel.ololosh.MainActivity.onClickStart:22 java.lang.reflect.Method.invokeNative:-2
04-17 02:56:42.043    1899-1899/com.example.pavel.ololosh W/ContextImpl﹕ Implicit intents with startService are not safe: Intent { act=ru.startandroid.develop.p0942servicekillserver.MyService (has extras) } android.content.ContextWrapper.startService:494 com.example.pavel.ololosh.MainActivity.onClickStart:22 java.lang.reflect.Method.invokeNative:-2
04-17 02:56:42.683    1899-1899/com.example.pavel.ololosh W/ContextImpl﹕ Implicit intents with startService are not safe: Intent { act=ru.startandroid.develop.p0942servicekillserver.MyService (has extras) } android.content.ContextWrapper.startService:494 com.example.pavel.ololosh.MainActivity.onClickStart:22 java.lang.reflect.Method.invokeNative:-2
Последние три лога - нажатие на кнопку старт.

Для AVD 4.0.3 при нажатии на кнопку вообще никаких логов нету и ничего не происходит.

Для AVD 5.0.1:

Код: Выделить всё

04-17 10:09:10.830    2184-2200/com.example.pavel.servicekillclient D/OpenGLRenderer﹕ Render dirty regions requested: true
04-17 10:09:10.951    2184-2184/com.example.pavel.servicekillclient D/﹕ HostConnection::get() New Host Connection established 0xb0c9ec10, tid 2184
04-17 10:09:10.965    2184-2184/com.example.pavel.servicekillclient D/Atlas﹕ Validating map...
04-17 10:09:11.313    2184-2196/com.example.pavel.servicekillclient I/art﹕ Background sticky concurrent mark sweep GC freed 3605(178KB) AllocSpace objects, 1(20KB) LOS objects, 47% free, 328KB/623KB, paused 35.038ms total 189.529ms
04-17 10:09:11.397    2184-2200/com.example.pavel.servicekillclient D/﹕ HostConnection::get() New Host Connection established 0xb0c9ed90, tid 2200
04-17 10:09:11.412    2184-2200/com.example.pavel.servicekillclient I/OpenGLRenderer﹕ Initialized EGL, version 1.4
04-17 10:09:11.502    2184-2200/com.example.pavel.servicekillclient D/OpenGLRenderer﹕ Enabling debug mode 0
04-17 10:09:11.517    2184-2200/com.example.pavel.servicekillclient W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-17 10:09:11.517    2184-2200/com.example.pavel.servicekillclient W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa7561980, error=EGL_SUCCESS
04-17 10:09:17.378    2184-2184/com.example.pavel.servicekillclient D/AndroidRuntime﹕ Shutting down VM
04-17 10:09:17.422    2184-2184/com.example.pavel.servicekillclient E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.pavel.servicekillclient, PID: 2184
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4007)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            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:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     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:4002)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            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:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=ru.startandroid.develop.p0942servicekillserver.MyService (has extras) }
            at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1674)
            at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1703)
            at android.app.ContextImpl.startService(ContextImpl.java:1687)
            at android.content.ContextWrapper.startService(ContextWrapper.java:515)
            at com.example.pavel.servicekillclient.MainActivity.onClickStart(MainActivity.java:19)
            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:4002)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            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:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
04-17 10:09:19.994    2184-2184/com.example.pavel.servicekillclient I/Process﹕ Sending signal. PID: 2184 SIG: 9

Ответить