2015-08-29 3 views
0

В моем проекте андроида есть одно действие и на обслуживание. в основной компоновке у меня есть три элемента управления: 2 кнопки (кнопка запуска и остановки) и TextView (для результата). Когда я нажимаю кнопку запуска, служба запускается и отправляет текстовое сообщение через localbroadcastmanager в основное действие, и активность должна показывать сообщение в TextView, но этого не происходит. Я также должен добавить, что я добавил Android Support Library v4 в свой проект, и я не получаю ошибок и сбоев при запуске приложения. Я тестировал этот код на реальном устройстве и genymotion, но я не получил желаемого результата. я бы, если бы вы сказать, что не так с моими кодами: Вот мой код активность:LocalBroadcastManager не работает

package ir.sanatnegar.lbcm; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v4.content.LocalBroadcastManager; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 


public class LBCMActivity extends Activity { 

    Button btnStart; 
    Button btnStop; 
    TextView tvMessage; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("SAED")); 
     btnStart = (Button) findViewById(R.id.btnStart); 
     btnStart.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       startService(new Intent(LBCMActivity.this, MyService.class)); 

      } 
     }); 
     btnStop = (Button) findViewById(R.id.btnStop); 
     btnStop.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       stopService(new Intent(LBCMActivity.this, MyService.class)); 

      } 
     }); 

    } 


    @Override 
    protected void onPause() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
     super.onPause(); 
    } 


    @Override 
    protected void onResume() { 
     LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("SAED")); 

     super.onResume(); 
    } 

    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 

                @Override 
                public void onReceive(Context context, Intent intent) { 
                 Log.i("LOG", "Message Received ... "); 
                 String message = intent.getStringExtra("message"); 
                 tvMessage.setText(message); 

                } 
               }; 
} 

// Служба Код:

package ir.sanatnegar.lbcm; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.support.v4.content.LocalBroadcastManager; 
import android.util.Log; 


public class MyService extends Service { 

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


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("LOG", "onStartCommand occured"); 
     sendMessage(); 
     return super.onStartCommand(intent, flags, startId); 
    } 


    @Override 
    public void onDestroy() { 
     Log.i("LOG", "onDestroty occured"); 
     super.onDestroy(); 
    } 


    private void sendMessage() 
    { 
     Log.i("LOG", "Broadcasting Message ..."); 
     Intent intent = new Intent("SAED"); 
     intent.putExtra("message", "This is a message from MyService!!!"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

    } 

} 
+0

ли вы объявляете ваш сервис в AndroidManifest файл? –

+0

да, конечно ... Я сказал выше, что у меня нет никакого сбоя ... я также могу видеть все журналы в logcat – Sanatnegar

ответ

0

Я не вижу ничего плохого в вашем коде, за исключением отсутствующее присвоение tvMessage.

tvMessage = (TextView) findViewById (R.id.msg);

но это должно дать вам исключение во время выполнения на этой линии -

tvMessage.setText (сообщение);

Я пробовал код и отлично работает на своем телефоне, а текстовое поле отображает «Это сообщение от MyService» при нажатии кнопки «Пуск».

+0

ты был прав мой друг, я забыл объявить tvMessage. Я добавил объявление, но я пока не получаю сообщение. :-(у вас есть какое-то решение? – Sanatnegar

+0

Я скопировал полный код, и он работает нормально. Он должен работать сейчас. Покажите свой логарифм и ваш файл макета. Вы видите, что текстовое поле хорошо размещено. – Nicks

0

Вот мой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="ir.sanatnegar.lbcm" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".LBCMActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name=".MyService" android:process=":my_service" /> 
    </application> 

</manifest> 
+0

У меня есть решение .. определение сервиса в манифесте было неправильным ... я удаляю: android: process = ": my_service" stament из объявления сервиса. В любом случае спасибо за внимание – Sanatnegar

+0

из-за тега android: process был запущен в отдельном процессе его и поэтому этот процесс не обновлял ваш основной поток пользовательского интерфейса. Рад, если бы я немного помог. – Nicks

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