使用services在後臺實現下載與遠程服務


使用services在後臺實現下載

AndroidManifest.xml

<!--配置服務-->
        <service android:name=".MyService2"
            android:enabled="true"
            android:exported="true"></service>

Main2Activity.java

package com.zking.administrator.g160628_android23_services;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

public class Main2Activity extends AppCompatActivity {

    private ProgressBar pb_progressbar_bar;
    private TextView tv_progressbar_num;
    private Intent intent;
    private MyReceiver myReceiver;
    private IntentFilter intentFilter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        myReceiver = new MyReceiver();
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.zking.administrator.g160628_android23_services.download");
        intent=new Intent(this,MyService2.class);//服務器
        pb_progressbar_bar= (ProgressBar) findViewById(R.id.pb_progressbar);
        tv_progressbar_num= (TextView) findViewById(R.id.tv_progressbar_num);
    }

    //動態配置廣播接收器
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(myReceiver,intentFilter);
    }

    //動態配置廣播接收器
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
    //單擊下載按鈕,啓動服務,記得配置服務
    public void download(View view){
        startService(intent);
    }
    Handler handler=new Handler(){
        //接受消息,更新UI界面
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int i=msg.what;
            tv_progressbar_num.setText(i+"");
        }
    };
    //接收廣播的內部類
    class MyReceiver extends BroadcastReceiver{

        private int content;
        @Override
        public void onReceive(Context context, Intent intent) {
            //獲取廣播的名字
            String action=intent.getAction();
            if("com.zking.administrator.g160628_android23_services.download".equals(action)) {
                content = intent.getIntExtra("content", 50);//接收發送過來的廣播,默認值爲50
                new MyThread().start();//啓動線程
            }
        }
            //通過線程拿到發送過來的值
            class MyThread extends Thread {
                @Override
                public void run() {
                    super.run();
                    for (int i = 0; i <= 100; i++) {
                        pb_progressbar_bar.setProgress(content);//將接收的值設置給進度條
                        handler.sendEmptyMessage(content);//通過handler發送給本界面
                        try {
                            sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

MyService2.java

package com.zking.administrator.g160628_android23_services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * Created by Administrator on 2017/7/14.
 */

public class MyService2 extends Service{
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new MyThread(startId).start();
        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    class MyThread extends Thread{
        private int startId;
        public MyThread(int startId){
            this.startId=startId;
        }

        @Override
        public void run() {
            //創建發送廣播
            Intent intent= new Intent();
            //廣播的名字
            intent.setAction("com.zking.administrator.g160628_android23_services.download");
            for (int i = 1; i <=100 ; i++) {
                //設置發送的值
                intent.putExtra("content",i);
                Log.i("test","content,"+i);
                //發送
                sendBroadcast(intent);
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //服務自殺
            stopSelf();
        }
    }
}

服務端(QQ)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zking.administrator.g160628_android24_myqq.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MyQQ"
        android:textSize="30sp"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_main_number"
        android:hint="請輸入用戶名"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入密碼"
        android:id="@+id/et_main_pass"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登錄"
        android:onClick="login"/>
</LinearLayout>

MainActivity.java

package com.zking.administrator.g160628_android24_myqq;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

/**
 * 所謂的遠程服務,是同一部手機,裏面的兩個應用程序之間相互通信,被稱爲應用程序
 * 什麼樣的應用需要遠程服務?
 * QQ 微信 QQ輸入法,-->它們共同的特點就是登陸
 * 寫一個QQ登陸,把一個公共的模塊把它提取出來,讓其他手機上所有應用程序都調用它
 * C客戶端(微信和QQ輸入法) S服務端(QQ和QQ登錄)
 */
public class MainActivity extends AppCompatActivity {

    private EditText et_main_number;
    private EditText et_main_pass;
    private Intent intent;
//    private QQLoginService.MyIBinder myIBinder;
    //3.0版本使用接口
//    private QQLogin qqLogin;
    //自動生成的類
    private QQLoginInterface qqLoginInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main_number = (EditText) findViewById(R.id.et_main_number);
        et_main_pass = (EditText) findViewById(R.id.et_main_pass);
        intent = new Intent(this,QQLoginService.class);
    }

    ServiceConnection connection=new ServiceConnection() {



        //連接成功
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("test","綁定成功");
            // 把IBinder強轉成我們自己寫的MyIBinder
//            myIBinder = (QQLoginService.MyIBinder) service;
            //給接口
//            qqLogin = (QQLogin) service;
            //自動生成的類
            qqLoginInterface = QQLoginInterface.Stub.asInterface(service);
        }

        //連接失敗
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("test","綁定失敗");

        }
    };
    @Override
    protected void onResume() {
        super.onResume();
        //綁定服務
        //Service.BIND_AUTO_CREATE在我綁定的時候自動創建服務
        bindService(intent,connection, Service.BIND_AUTO_CREATE);
    }

    public void login(View view){
        //當我一點登錄按鈕,首先拿到用戶名和密碼
        String number=et_main_number.getText().toString();
        String pass=et_main_pass.getText().toString();
        boolean flag= false;
        //自動生成拋異常
        try {
            flag = qqLoginInterface.login(number,pass);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        if(flag){
            Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "登錄失敗!", Toast.LENGTH_SHORT).show();
        }
        //3.0使用接口
//        boolean flag=qqLogin.login(number,pass);
//        if(flag){
//            Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
//        }else{
//            Toast.makeText(this, "登錄失敗!", Toast.LENGTH_SHORT).show();
//
//        }
        //當我一點登錄按鈕,我就可以調用myIBinder(2.0版本利用服務實現登錄)
//        boolean flag=myIBinder.login(number,pass);
//        if(flag){
//            Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
//        }else{
//            Toast.makeText(this, "登錄失敗!", Toast.LENGTH_SHORT).show();
//
//        }
//        //判斷用戶名和密碼(1.0版本)
//        if("00000".equals(number)&&"123456".equals(pass)){
//            Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
//        }else{
//            Toast.makeText(this, "登錄失敗!", Toast.LENGTH_SHORT).show();
//        }
    }
}

QQLogin.java

package com.zking.administrator.g160628_android24_myqq;

/**
 * Created by Administrator on 2017/7/15.
 */

public interface QQLogin {
    public boolean login(String number,String pass);
}
QQLoginInterface.aidl

// QQLoginInterface.aidl
package com.zking.administrator.g160628_android24_myqq;

// Declare any non-default types here with import statements

interface QQLoginInterface {
//不允許用修飾符
   boolean login(String number,String pass);
}

QQLoginService.java

package com.zking.administrator.g160628_android24_myqq;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

/**
 * Created by Administrator on 2017/7/15.
 */

public class QQLoginService extends Service{
    //自動生成的內只要繼承QQLoginInterface
    class MyIBinder extends QQLoginInterface.Stub{

        @Override
        public boolean login(String number, String pass) throws RemoteException {
            if("00000".equals( number)&&"123456".equals(pass)){
            return true;
        }
            return false;
        }
    }
    //寫一個自己的內部類
    //把它看做jsp,servlet裏的業務邏輯類Dao層
//    class MyIBinder extends Binder implements QQLogin{
//        public boolean login(String number,String pass){
//            if("00000".equals(number)&&"123456".equals(pass)){
//                return true;
//            }else{
//                return false;
//            }
//        }
//    }
    //遠程服務就onBind一個就夠了
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("test","onBind");
        return new MyIBinder();
    }
}

AndroidManifest.xml

<!--配置-->
        <service android:name=".QQLoginService"
            android:enabled="true"
            android:exported="true"></service>

客戶端(微信)

QQLoginInterface.java

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: D:\\Android\\AndroidStudioProjects\\MyApplication3\\g160628_android24_myqq\\src\\main\\aidl\\com\\zking\\administrator\\g160628_android24_myqq\\QQLoginInterface.aidl
 */
package com.zking.administrator.g160628_android24_myqq;
// Declare any non-default types here with import statements

public interface QQLoginInterface extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements QQLoginInterface
{
private static final String DESCRIPTOR = "com.zking.administrator.g160628_android24_myqq.QQLoginInterface";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
 * Cast an IBinder object into an com.zking.administrator.g160628_android24_myqq.QQLoginInterface interface,
 * generating a proxy if needed.
 */
public static QQLoginInterface asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof QQLoginInterface))) {
return ((QQLoginInterface)iin);
}
return new Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_login:
{
data.enforceInterface(DESCRIPTOR);
String _arg0;
_arg0 = data.readString();
String _arg1;
_arg1 = data.readString();
boolean _result = this.login(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(((_result)?(1):(0)));
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements QQLoginInterface
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
//不允許用修飾符

@Override public boolean login(String number, String pass) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
boolean _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(number);
_data.writeString(pass);
mRemote.transact(Stub.TRANSACTION_login, _data, _reply, 0);
_reply.readException();
_result = (0!=_reply.readInt());
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_login = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
//不允許用修飾符

public boolean login(String number, String pass) throws android.os.RemoteException;
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zking.administrator.g160628_android24_myweixin.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MyWeiXin"
        android:textSize="30sp"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_main_number"
        android:hint="請輸入用戶名"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入密碼"
        android:id="@+id/et_main_pass"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登錄"
        android:onClick="login"/>
</LinearLayout>

MainActivity.java

package com.zking.administrator.g160628_android24_myweixin;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.zking.administrator.g160628_android24_myqq.QQLoginInterface;

/**
 *同一部手機裏邊兩個應用程序之間,一個客戶端《微信》,一個服務端《QQ》
 *
 */
public class MainActivity extends AppCompatActivity {

    private EditText et_main_number;
    private EditText et_main_pass;
    private Intent intent;
    private QQLoginInterface qqLoginInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_main_number = (EditText) findViewById(R.id.et_main_number);
        et_main_pass = (EditText) findViewById(R.id.et_main_pass);
        intent = new Intent();
        //QQLoginService包名加類名(第一個雙引號指的是應用程序的包名,在這樣的情況下就可以用微信啓動QQ的服務)
        ComponentName componentName=new ComponentName("com.zking.administrator.g160628_android24_myqq","com.zking.administrator.g160628_android24_myqq.QQLoginService");
        intent.setComponent(componentName);
    }

    ServiceConnection connection=new ServiceConnection() {


        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("test","綁定成功");
            qqLoginInterface = QQLoginInterface.Stub.asInterface(service);

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("test","綁定失敗");
        }
    };
    @Override
    protected void onResume() {
        super.onResume();
        //綁定服務
        bindService(intent,connection, Service.BIND_AUTO_CREATE);
    }

    public void login(View view){
        String number=et_main_number.getText().toString();
        String pass=et_main_pass.getText().toString();
        try {
            boolean b=qqLoginInterface.login(number,pass);
            if(b){
                Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(this, "登錄失敗!", Toast.LENGTH_SHORT).show();

            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章