2014-02-04 3 views
1

Мне нужно реализовать службу, которая работает в фоновом режиме, а затем другое приложение, которое принимает результаты сервиса и представляет его.Коммуникация двух разных проектов с одинаковым сервисом

Я сделал операцию, кроме запуска службы, и даже если это приложение уничтожено, служба продолжает работать.

активность:

package com.example.pruebaservice; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MainActivity extends Activity implements View.OnClickListener { 
    private Button telo, telo2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     telo = (Button) findViewById(R.id.button1); 
     telo.setOnClickListener(this); 
     telo2 = (Button) findViewById(R.id.button2); 
     telo2.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 
     case R.id.button1: 
      startService(new Intent(this, PruebaService.class)); 
      break; 
     case R.id.button2: 
      stopService(new Intent(this, PruebaService.class)); 
      break; 
     } 

    } 
} 

обслуживание:

package com.example.pruebaservice; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.app.Notification; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Intent; 
import android.content.res.AssetManager; 
import android.os.Environment; 
import android.os.Handler; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class PruebaService extends Service { 

    private Sistole_main telo; 
    private static final String SISTOLE_FOLDER = "SISTOLE_Audio"; 

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

    @Override 
    public void onCreate() { 

     Toast.makeText(this, "Servicio creado", Toast.LENGTH_LONG).show(); 
     Log.d("SERVICEBOOT", "Servicio creado"); 

     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath, SISTOLE_FOLDER); 
     if (!file.exists()) { 
      file.mkdirs(); 
     } 
     File file2 = new File(file.getAbsolutePath() + "/" + "trig.pcm"); 
     if (!file2.exists()) { 
      AssetManager manager = getApplicationContext().getAssets(); 
      try { 
       InputStream movefile = manager.open("trig.pcm"); 
       String ruta = file.getAbsolutePath() + "/" + "trig.pcm"; 
       OutputStream salida = new FileOutputStream(ruta); 

       byte[] buffer = new byte[1024]; 
       int tam; 
       while ((tam = movefile.read(buffer)) > 0) { 
        salida.write(buffer, 0, tam); 

       } 
       salida.flush(); 
       salida.close(); 
       movefile.close(); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 


     @SuppressWarnings("deprecation") 
     Notification note = new Notification(R.drawable.gradiant, 
       "Servicio SISTOLE", System.currentTimeMillis()); 

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

     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
       | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

     PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); 

     note.setLatestEventInfo(this, "SISTOLE", 
       "Calculando coordenadas", pi); 
     note.flags |= Notification.FLAG_NO_CLEAR; 

     startForeground(1337, note); 

     telo = new Sistole_main(); 
     telo.control(1); 

    } 

    @Override 
    public void onDestroy() { 

     Toast.makeText(this, "Servicio destruido", Toast.LENGTH_LONG).show(); 
     Log.d("SERVICEBOOT", "Servicio destruido"); 
     telo.control(0); 
    } 
} 

этот код работает нормально.

Но теперь вопрос .. Как сделать, чтобы создать второй проект, который имеет доступ к этой службе и принимает значения координат?

Помощь?

Благодаря

+0

Я думаю, вы должны использовать 'ContentProvider', чтобы обеспечить доступ между различными приложениями. – Rarw

ответ

0

Если вам нужна поддержка многопоточности в службе, то вам нужно AIDL. Если нет, то Mesenger будет работать нормально. В примерах, которые поставляются с SDK, есть пример кода, вы должны найти их во всех версиях платформы под api, например

C: \ YourRoot \ tools \ android-sdk-windows4.4 \ samples \ android-7 \ ApiDemos \ SRC \ COM \ например \ Android \ Apis \ приложение ..

искать файлы, начиная Remote ... Java и те, которые являются * .aidl

+0

Проверьте [здесь] (http://stackoverflow.com/questions/4300291/example-communication-between-activity-and-service-using-messaging) для замечательного примера – upenpat

+0

@upenpat - не так уж замечательно, так как оба активность и обслуживание находятся в одном приложении. Если бы вы внимательно посмотрели на манифест, вы бы это заметили. – NickT

+0

Я имел в виду, что это был простой пример, демонстрирующий использование Messenger. – upenpat

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