3

Я реализую программное обеспечение для Android, которое имеет сервис и деятельность. И я делаю код в соответствии с видео youtube. Но когда я нажимаю кнопку «Пуск», кнопка «Запуск» работает нормально. Но после того, как я перезапустил службу (нажав кнопку «Стоп», а затем снова нажмите «Пуск»), программа разбилась. Так может кто-нибудь, пожалуйста, помогите мне понять это.Android Активность службы Связь

Также есть ли способ в android для двусторонней связи между сервисом и деятельностью? (Пример: - служба получает местоположение GPS и меняет позицию на 0,001, а после этого автоматически отображает отредактированную позицию)

Пожалуйста, SomeOne помогите мне разобраться в этом.

Мой код: -

MyActivity.java

package com.example.autocomplete.servicemessenger; 

import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.Message; 
import android.os.Messenger; 
import android.os.RemoteException; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Toast; 


public class MyActivity extends Activity { 
    boolean status=false; 
    Messenger msngr=null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 
    } 


    @Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.my, 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(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

public void startMethod(View v){ 
    if (status){ 
     Toast.makeText(getApplicationContext(), "already started", Toast.LENGTH_SHORT).show(); 
    } 
    else { 
     Intent i = new Intent(this, MyService.class); 
     bindService(i, mConnection, Context.BIND_AUTO_CREATE); 
     status = true; 
     Toast.makeText(getApplicationContext(), "start", Toast.LENGTH_SHORT).show(); 
    } 
} 

public void stoptMethod(View v){ 
    if (status) { 
     Intent i = new Intent(this, MyService.class); 
     unbindService(mConnection); 
     stopService(i); 

     mConnection = null; 
     status = false; 
     Toast.makeText(getApplicationContext(), "stop", Toast.LENGTH_SHORT).show(); 
    } 
    else{ 
     Toast.makeText(getApplicationContext(), "already stopped", Toast.LENGTH_SHORT).show(); 
    } 
} 

public void runMethod(View v){ 
    Message ms=Message.obtain(null,1,0,0,0); 
    String s="This is the message by Activity"; 
    Bundle bn=new Bundle(); 
    bn.putString("my_string",s); 
    ms.setData(bn); 
    try { 
     msngr.send(ms); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 

} 

ServiceConnection mConnection=new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName componentName, IBinder service) { 
     msngr=new Messenger(service); 
     status=true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName componentName) { 
     msngr=null; 
     status=false; 
     Toast.makeText(getApplicationContext(),"Disc",Toast.LENGTH_SHORT).show(); 
    } 
}; 
} 

MyService.java

package com.example.autocomplete.servicemessenger; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.Message; 
import android.os.Messenger; 
import android.text.format.Time; 
import android.widget.Toast; 

import java.util.logging.Handler; 

/** 
* Created by NRV on 9/3/2014. 
*/ 
public class MyService extends Service { 
int val=1; 
@Override 
public IBinder onBind(Intent intent) { 
    return msgnr.getBinder(); 
} 



@Override 
public boolean onUnbind(Intent intent) { 
    stopSelf(); 
    return super.onUnbind(intent); 
} 

class MessageHandler extends android.os.Handler{ 

    public void handleMessage(Message msg){ 
     if (msg.what==val){ 
      Toast.makeText(getBaseContext(),"I am toast in service",Toast.LENGTH_SHORT).show(); 
      Bundle bundle=msg.getData(); 
      String msg_snt=bundle.getString("my_string"); 
      Toast.makeText(getApplicationContext(),"I recv : "+msg_snt,Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      super.handleMessage(msg); 
     } 

    } 
} 

Messenger msgnr=new Messenger(new MessageHandler()); 


} 

activity_my.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MyActivity"> 

<TextView 
    android:text="@string/hello_world" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/textView" 
    /> 

<Button 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Start" 
    android:id="@+id/button" 
    android:layout_below="@+id/textView" 
    android:layout_marginTop="93dp" 
    android:layout_toLeftOf="@+id/button2" 
    android:onClick="startMethod"/> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Stop" 
    android:id="@+id/button2" 
    android:layout_below="@+id/button" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="106dp" 
    android:onClick="stoptMethod"/> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Run" 
    android:id="@+id/button3" 
    android:layout_below="@+id/button2" 
    android:layout_alignParentLeft="true" 
    android:onClick="runMethod"/> 

</RelativeLayout> 

ответ

1

Когда вы делаете mConnection = нуль в stoptMethod (View) об, и когда ваш пытаются связать службу с startMethod (View) об он пытается связать службу с mConnection (который является нулевым). Поэтому он рушится. Исправление: комментарий mConnection = null in stoptMethod (View v). Также не требуется

Intent i = новое намерение (это, MyService.class); StopService (я); в stoptMethod (View v)

Служба «привязана», когда компонент приложения связывается с ней, вызывая bindService(). Связанная служба предлагает интерфейс клиент-сервер, который позволяет компонентам взаимодействовать с сервисом, отправлять запросы, получать результаты и даже делать это через процессы с межпроцессорной связью (IPC). Связанная служба работает только до тех пор, пока к ней привязан другой компонент приложения. Несколько компонентов могут сразу связываться с сервисом, но когда все они отвязаны, служба уничтожается.

Для получения дополнительной информации, пожалуйста, посетите bound-services и Services.

Смежные вопросы