您的位置:首页 > 其它

activity和service的交互

2015-09-20 14:09 405 查看
在Android开发过程中,我们可能需要这样的需求:

使用activity开启一个service,而service中开启了一个线程,线程中有一个变量,而activity想获取service中的这个变量

解决方式:在activity中设置一个receiver,用来获取service中线程的变量,详细代码如下:

MainActivity核心代码:

public class MainActivity extends Activity {

private Button start,stop,bind,unbind;//定义四个按钮,分别为启动service的两种方式

private ServiceConnection sConnection;//用来bindservice

private TextView textView;

MyReceiver1 myReceiver;//自定义的receiver

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView=(TextView)findViewById(R.id.textView2);

    //向系统注册receiver
    myReceiver=new MyReceiver1();
    IntentFilter filter=new IntentFilter();
    filter.addAction("com.example.servicedemo.MyReceiver");
    MainActivity.this.registerReceiver(myReceiver, filter);

    start=(Button)findViewById(R.id.button1);
    stop=(Button)findViewById(R.id.button2);
    bind=(Button)findViewById(R.id.button3);
    unbind=(Button)findViewById(R.id.button4);
    //用于service绑定activity
    sConnection=new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("log", "onServiceDisconnected调用成功...");

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("log", "onServiceConnected调用成功...");

        }
    };

}
//自定义的MyReceiver,具体实现
public class MyReceiver1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle=intent.getExtras();
        int count=bundle.getInt("count");
        Toast.makeText(MainActivity.this, count+"", Toast.LENGTH_SHORT).show();
    }

}
public void click(View v)
{
    Intent intent=new Intent(MainActivity.this,ServiceDemo.class);
    switch (v.getId()) {
    case R.id.button1:
        //启动service
        startService(intent);
        Toast.makeText(MainActivity.this, "利用startService启动了service", Toast.LENGTH_SHORT).show();
        break;
    case R.id.button2:
        stopService(intent);
        Toast.makeText(MainActivity.this, "利用stopService", Toast.LENGTH_SHORT).show();
        break;
    case R.id.button3:
        bindService(intent, sConnection, BIND_AUTO_CREATE);
        Toast.makeText(MainActivity.this, "利用BindService启动了service", Toast.LENGTH_SHORT).show();
        break;
    case R.id.button4:
        unbindService(sConnection);
        Toast.makeText(MainActivity.this, "利用unbindService", Toast.LENGTH_SHORT).show();
        break;

    }
}


ServiceDemo核心代码为:

public class ServiceDemo extends Service {

private final String TAG=”log”;

private int count=0;//这个使我们需要获取的数据

private boolean isClosed=false;//判断service时候开启或关闭

@Override
public IBinder onBind(Intent intent) {
    Log.i(TAG, "调用了onBind()方法...");
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG, "调用了onCreate()方法...");
    new Thread(new Runnable() {

        @Override
        public void run() {
            while(!isClosed)
            {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                count++;
                Intent intent=new Intent();;
                intent.putExtra("count", count);
                intent.setAction("com.example.servicedemo.MyReceiver");
                sendBroadcast(intent);
            }

        }
    }).start();
}


manifest文件的代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: