zoukankan      html  css  js  c++  java
  • Android中Service的一个Demo例子

      Android中Service的一个Demo例子
      Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding。
      本文,主要贴代码,不对Service做过多讲解。
      代码是从网上找的一个例子,Copy下来发现代码不完全正确,稍微修改了下。
      AndroidManifest.xml
       
    <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <activity
                android:label="@string/app_name"
                android:name=".service.ServiceMainActivity" >
                <intent-filter >
                    <action android:name="android.intent.action.MAIN" />
    
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
             <!-- 注册Service -->  
            <service android:name="LocalService">  
                <intent-filter>  
                    <action android:name="cn.fansunion.service.LocalService" />  
                </intent-filter>  
            </service>  
        </application>



    ServiceMainActivity.java
    package cn.fansunion.service;
    
    
    import cn.fansunion.R;
    import android.app.Activity;
    import android.app.Service;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    
    public class ServiceMainActivity extends Activity {
    	private Button startBtn;
    	private Button stopBtn;
    	private Button bindBtn;
    	private Button unBindBtn;
    	private static final String TAG = "MainActivity";
    	private LocalService myService;
    
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.service);
    		startBtn = (Button) findViewById(R.id.start);
    		stopBtn = (Button) findViewById(R.id.stop);
    		bindBtn = (Button) findViewById(R.id.bind);
    		unBindBtn = (Button) findViewById(R.id.unbind);
    		startBtn.setOnClickListener(new MyOnClickListener());
    		stopBtn.setOnClickListener(new MyOnClickListener());
    		bindBtn.setOnClickListener(new MyOnClickListener());
    		unBindBtn.setOnClickListener(new MyOnClickListener());
    	}
    
    
    	class MyOnClickListener implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			Intent intent = new Intent();
    			intent.setClass(ServiceMainActivity.this, LocalService.class);
    			switch (v.getId()) {
    			case R.id.start:						
    				// 启动Service
    				startService(intent);
    				toast("startService");
    				break;
    			case R.id.stop:
    				// 停止Service
    				stopService(intent);
    				toast("stopService");
    				break;
    			case R.id.bind:
    				// 绑定Service
    				bindService(intent, conn, Service.BIND_AUTO_CREATE);
    				toast("bindService");
    				break;
    			case R.id.unbind:
    				// 解除Service
    				unbindService(conn);
    				toast("unbindService");
    				break;
    			}
    		}
    	}
    
    
    	private void toast(final String tip){
    		runOnUiThread(new Runnable() {					 
                @Override
                public void run() {
                	Toast.makeText(getApplicationContext(), tip, Toast.LENGTH_SHORT).show();                         
                }
            });
    	}
    	private ServiceConnection conn = new ServiceConnection() {
    		@Override
    		public void onServiceConnected(ComponentName name, IBinder service) {
    			Log.e(TAG, "连接成功");
    			// 当Service连接建立成功后,提供给客户端与Service交互的对象(根据Android Doc翻译的,不知道准确否。。。。)
    			myService = ((LocalService.LocalBinder) service).getService();
    		}
    
    
    		@Override
    		public void onServiceDisconnected(ComponentName name) {
    			Log.e(TAG, "断开连接");
    			myService = null;
    		}
    	};
    }




    LocalService.java
    package cn.fansunion.service;
    
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    import android.util.Log;
    import android.widget.Toast;
    
    
    public class LocalService extends Service {
    	private static final String TAG = "MyService";
    	private final IBinder myBinder = new LocalBinder();
    
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		Log.e(TAG, "onBind()");
    		//Toast.makeText(this, "onBind()", Toast.LENGTH_SHORT).show();
    		return myBinder;
    	}
    
    
    	// 调用startService方法或者bindService方法时创建Service时(当前Service未创建)调用该方法
    	@Override
    	public void onCreate() {
    		Log.e(TAG, "onCreate()");
    		//Toast.makeText(this, "onCreate()", Toast.LENGTH_SHORT).show();
    	}
    
    
    	// 调用startService方法启动Service时调用该方法
    	@Override
    	public void onStart(Intent intent, int startId) {
    		Log.e(TAG, "onStart()");		
    		//Toast.makeText(this, "onStart()", Toast.LENGTH_SHORT).show();
    	}
    
    
    	// Service创建并启动后在调用stopService方法或unbindService方法时调用该方法
    	@Override
    	public void onDestroy() {
    		Log.e(TAG, "onDestroy()");
    		//Toast.makeText(this, "onDestroy()", Toast.LENGTH_SHORT).show();
    	}
    	//提供给客户端访问
    	public class LocalBinder extends Binder {
    		LocalService getService() {
    			return LocalService.this;
    		}
    	}
    }


    service.xml布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" android:layout_width="fill_parent"
    	android:layout_height="fill_parent">
    	<Button android:id="@+id/start" android:layout_width="wrap_content"
    		android:layout_height="wrap_content" android:text="启动Service" />
    	<Button android:id="@+id/stop" android:layout_width="wrap_content"
    		android:layout_height="wrap_content" android:text="停止Service" />
    	<Button android:id="@+id/bind" android:layout_width="wrap_content"
    		android:layout_height="wrap_content" android:text="绑定Service" />
    	<Button android:id="@+id/unbind" android:layout_width="wrap_content"
    		android:layout_height="wrap_content" android:text="解除Service" />
    </LinearLayout>



      [2015-11-14 17:39:10 - xp2p4android] ------------------------------
    [2015-11-14 17:39:10 - xp2p4android] Android Launch!
    [2015-11-14 17:39:10 - xp2p4android] adb is running normally.
    [2015-11-14 17:39:10 - xp2p4android] Performing cn.fansunion.service.ServiceMainActivity activity launch
    [2015-11-14 17:39:10 - xp2p4android] Automatic Target Mode: using device '51bf63f2'
    [2015-11-14 17:39:10 - xp2p4android] Uploading xp2p4android.apk onto device '51bf63f2'
    [2015-11-14 17:39:10 - xp2p4android] Installing xp2p4android.apk...
    [2015-11-14 17:39:13 - xp2p4android] Success!
    [2015-11-14 17:39:13 - xp2p4android] Starting activity cn.fansunion.service.ServiceMainActivity on device 51bf63f2
    [2015-11-14 17:39:13 - xp2p4android] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.fansunion/.service.ServiceMainActivity }
    [2015-11-14 17:39:13 - xp2p4android] Attempting to connect debugger to 'cn.fansunion' on port 8600


    运行效果图


    原来的代码,Toast对话框没有展示出来。
    在CSDN论坛找到一个贴子说,可能是被手机屏蔽了。
    我倒是觉得更有可能调用的方式不对。
    Service中调用,Toast合适么?
    public void onCreate() {
    Log.e(TAG, "onCreate()");
    //Toast.makeText(this, "onCreate()", Toast.LENGTH_SHORT).show();
    }


    最后参考网友的办法,在UI线程,新建线程执行Toast。
    private void toast(final String tip){
    runOnUiThread(new Runnable() {  
                @Override
                public void run() {
                Toast.makeText(getApplicationContext(), tip, Toast.LENGTH_SHORT).show();                         
                }
            });
    }
    不错,是在Activity中调用的。


    这充分说明,网上代码再漂亮,还是得动手运行下。
    代码的那个贴子,是2011年了,好古老啊~


    参考资料
    Android中Service组件详解
    http://blog.csdn.net/zuolongsnail/article/details/6427037


    Android Toast显示不出来
    http://bbs.csdn.net/topics/390889540
  • 相关阅读:
    Fix Installing .NET Framework 3.5 failed Error Code 0x800F0954 on Windows 10
    RHEL8安装五笔输入法
    Enable EPEL and Local Repository on RHEL8
    Why is Yum Replaced by DNF?
    检查Linux服务器是否被攻击的常用命令及方法
    IDEA 主题
    IDEA 如何显示一个类中所有的方法
    Appium 安装以及安装过程中遇到的问题
    Maven 如何发布 jar 包到 Nexus 私库
    java泛型的基本使用
  • 原文地址:https://www.cnblogs.com/qitian1/p/6462593.html
Copyright © 2011-2022 走看看