活动和服务之间的交换

时间:2015-04-29 17:05:44

标签: android android-activity service binding

我在一个应用程序中有两个活动和一个服务

activity2将启动和停止服务

activity1是主要的UI

该服务有两个假定的任务: 1-通过套接字从服务器接收数据并将其传递给activity1以更新用户界面

2-从activity1接收数据并将其发送到服务器

问题是我无法清楚地了解如何通过活动制作服务交换数据

我读到AIDL,绑定http://developer.android.com/guide/components/bound-services.html

我无法在我的代码上应用它,即使经过三个星期的努力我还没有得到它!

谢谢你!

服务:

    package com.bannob.shms;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import com.bannob.shms.NetService.LocalBinder;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.Toast;
import android.widget.TextView;
import android.widget.ToggleButton;
import android.widget.VideoView;
import android.widget.ViewFlipper;




public class Main extends Activity {

    public static ViewFlipper vf, lightvf, secvf;
    private Float oldTouchValue;
    public static TextView tv1, lighttv, sectv, tvlight1, tvlight2, tvlight3, 
    tvlight4, gasactivetv, flameactivetv, mdetect1tv, automodtv, indoortv, hmdtv;
    public static LinearLayout wallpaper, fansbanner;
    public static ToggleButton envtog1, envtog2, envtog3, envtog4;
    public static Switch lights1, lights2, lights3, lights4;
    public static VideoView vview;
    public static ImageView safeiv1, safeiv2, seciv1, seciv2, secbubble, safebubble;
    Typeface tf;
    BufferedReader in = null;
    File file;
    File values;
    String[] valuesArray= new String[30];
    int a;
    String a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20;
    NetService mService;
    boolean mBound = false;

    /**********************************************************************/
    /* Look for the definitions of the previous declarations below !!!!   */
    /**********************************************************************/


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  // reference to activity_main.Xml at layout Folder


        TextView tv1 = (TextView) findViewById ()

        onStart();

        tv1.setText(mService.a1);







    @Override
    protected void onStart() {
        super.onStart();
        // Bind to LocalService
        Intent intent = new Intent(this, NetService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // Unbind from the service
        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }

    /** Defines callbacks for service binding, passed to bindService() */
    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                IBinder service) {
            // We've bound to LocalService, cast the IBinder and get LocalService instance
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };

}    

UI活动:

package com.bannob.shms;



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

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

public class Connect extends Activity {

    EditText conet1;
    Button con ;
    public static Boolean state = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.connect);

        con = (Button) findViewById(R.id.conb1);

        conet1 = (EditText) findViewById(R.id.conet1);

        con.setOnClickListener(new View.OnClickListener(){          

            public void onClick(View v) {
                if(state == false ){
                startService(new Intent(getBaseContext(), NetService.class));
                state = true;
                con.setText("Disconnect");

                }
                else{
                stopService(new Intent(getBaseContext(), NetService.class));    
                state = false;  
                con.setText("Connect");
                }


            }
        });
    }

}

第二项活动(启动服务):

{{1}}

1 个答案:

答案 0 :(得分:0)

推荐方式
 BroadCastReceiver& sendBroadcast

在你的活动中注册一个BroadcastReciver

IntentFilter    newFileReceiverfilter = new IntentFilter(App.INTENT_NEW_FILE_COMMING ) ;
        registerReceiver(newfileReceiver, newFileReceiverfilter);

        newfileReceiver = new BroadcastReceiver() {

                @Override
                public void onReceive(Context arg0, Intent in) {
                                    Log.i("FileName", in.getStringExtra(IntentExtrasKeys.NF_FILE_NAME) + "");
                }
                }

在您的服务中广播您想要作为额外发送的数据的意图

Intent intent = new Intent(App.INTENT_NEW_FILE_COMMING);
     intent.putExtra(IntentExtrasKeys.NF_FILE_NAME, "img2.jpg" ) ;
     ctx.sendBroadcast(intent);

从活动中向服务发送更多数据只需发送更多意图
有肮脏的方式你可以让服务在静态类中写它并从活动中读取静态类