使用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();
}
}
}