导航:首页 > 操作系统 > androidservice内部类

androidservice内部类

发布时间:2022-09-18 06:02:11

android 怎么调用service里的方法

直接传activity 引用肯定是不行的, 最简单的是 用静态全局变量 ,不过不推荐。 所以只能复杂一点 ,不能service可以直接调用activity ,只能传消息给activity ,让activity 执行特定的方法。 就是 service start activity 。 而activity 设置为 single instance ,在newIntent 方法 里面 处理 传入消息。 还有一个方法就是activity 里面定义 一个 内部类 broadcast ,然后 service 调用sendbraoadcast , broadcast 再调用 activity 方法。

❷ 怎样在android的service中调用Activity中的getWindow函数

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题

通过Binder对象

当Activity通过调用bindService(Intent service, ServiceConnection conn,int flags),我们可以得到一个Service的一个对象实例,然后我们就可以访问Service中的方法,我们还是通过一个例子来理解一下吧,一个模拟下载的小例子,带大家理解一下通过Binder通信的方式
首先我们新建一个工程Communication,然后新建一个Service类

[java] view plain
<span style="font-family:System;">package com.example.communication;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class MsgService extends Service {
/**
* 进度条的最大值
*/
public static final int MAX_PROGRESS = 100;
/**
* 进度条的进度值
*/
private int progress = 0;

/**
* 增加get()方法,供Activity调用
* @return 下载进度
*/
public int getProgress() {
return progress;
}

/**
* 模拟下载任务,每秒钟更新一次
*/
public void startDownLoad(){
new Thread(new Runnable() {

@Override
public void run() {
while(progress < MAX_PROGRESS){
progress += 5;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}).start();
}

/**
* 返回一个Binder对象
*/
@Override
public IBinder onBind(Intent intent) {
return new MsgBinder();
}

public class MsgBinder extends Binder{
/**
* 获取当前Service的实例
* @return
*/
public MsgService getService(){
return MsgService.this;
}
}

}</span>
上面的代码比较简单,注释也比较详细,最基本的Service的应用了,相信你看得懂的,我们调用startDownLoad()方法来模拟下载任务,然后每秒更新一次进度,但这是在后台进行中,我们是看不到的,所以有时候我们需要他能在前台显示下载的进度问题,所以我们接下来就用到Activity了

[java] view plain
Intent intent = new Intent("com.example.communication.MSG_ACTION");
bindService(intent, conn, Context.BIND_AUTO_CREATE);

通过上面的代码我们就在Activity绑定了一个Service,上面需要一个ServiceConnection对象,它是一个接口,我们这里使用了匿名内部类

[java] view plain
<span style="font-family:System;"> ServiceConnection conn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {

}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//返回一个MsgService对象
msgService = ((MsgService.MsgBinder)service).getService();

}
};</span>
在onServiceConnected(ComponentName name, IBinder service) 回调方法中,返回了一个MsgService中的Binder对象,我们可以通过getService()方法来得到一个MsgService对象,然后可以调用MsgService中的一些方法,Activity的代码如下

[java] view plain
<span style="font-family:System;">package com.example.communication;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
private MsgService msgService;
private int progress = 0;
private ProgressBar mProgressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//绑定Service
Intent intent = new Intent("com.example.communication.MSG_ACTION");
bindService(intent, conn, Context.BIND_AUTO_CREATE);

mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
Button mButton = (Button) findViewById(R.id.button1);
mButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//开始下载
msgService.startDownLoad();
//监听进度
listenProgress();
}
});

}

/**
* 监听进度,每秒钟获取调用MsgService的getProgress()方法来获取进度,更新UI
*/
public void listenProgress(){
new Thread(new Runnable() {

@Override
public void run() {
while(progress < MsgService.MAX_PROGRESS){
progress = msgService.getProgress();
mProgressBar.setProgress(progress);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}).start();
}

ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {

}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//返回一个MsgService对象
msgService = ((MsgService.MsgBinder)service).getService();

}
};

@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}

}</span><span style="font-family: simsun;">
</span>
其实上面的代码我还是有点疑问,就是监听进度变化的那个方法我是直接在线程中更新UI的,不是说不能在其他线程更新UI操作吗,可能是ProgressBar比较特殊吧,我也没去研究它的源码,知道的朋友可以告诉我一声,谢谢!

上面的代码就完成了在Service更新UI的操作,可是你发现了没有,我们每次都要主动调用getProgress()来获取进度值,然后隔一秒在调用一次getProgress()方法,你会不会觉得很被动呢?可不可以有一种方法当Service中进度发生变化主动通知Activity,答案是肯定的,我们可以利用回调接口实现Service的主动通知,不理解回调方法的可以看看http://blog.csdn.net/xiaanming/article/details/8703708
新建一个回调接口

[java] view plain
public interface OnProgressListener {
void onProgress(int progress);
}
MsgService的代码有一些小小的改变,为了方便大家看懂,我还是将所有代码贴出来

❸ android内部类

  1. 首先,注释这两行的写法,没有问题。

  2. 我猜想你的main.xml中没有id是eat或sleep的CheckBox(或者没有,或者强转出错 )

  3. 把具体的报错贴出来,这样才能直接找到问题,不要让大家来猜谜,这样定位会很快。

❹ android 中 service 如果作为 内部类 的话怎么在配置文件中被注册啊

内部类不可以

Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。

❺ android studio 的内部类和匿名内部类有什么关系

一、内部类: 内部类是定义在另一个类中的类,使用它的原因主要有3个: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据; 内部类可以对同一个包中的其他类隐藏以来; 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部

❻ android中service和receiver通信的问题,求指教

TestReceiver.java 中 activity 成员变量为 null,没有赋值。

哥们你实在不行把它弄成 static 的,然后在 Activity 创建的时候初始化一下~
当然这样代码写的就不敢恭维了……

如果你想让 receiver “通知” Activity 执行 UI 操作,我觉得你是不是想要玩一下 MVC 啊?你可以把 Receiver 做成 Activity 的 内部类,然后使用 Java 代码动态注册 Receiver,这样内部类直接可以操作外部类 Activity 的成员变量~

提示一下,如果想玩 MVC 的话建议使用 Handler 实现通知机制。

❼ android内部类怎么使用

Android程序是调用Activity来实现界面显示,然后再这个界面(即Activity)上创建各种控件来显示你想什么样的形式输出界面及内容。
若想实现你说的那种“打印test”, 需要调用“TextView控件”来实现你说的那样的意图。所以你的那个代码只能在创建的JAVA项目,是可用的。
2011年

❽ 如何给Android应用创建本地服务

本文通过代码向大家详细介绍和演示这两种的服务的创建过程,代码适用于Android2.3.3以后的版本。
定义清单文件(AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<!-- 本例为了方便,将启动类型服务的Activity和绑定类型服务的Activity放到了一个类中:
LocalServiceActivities.java -->
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="my.android.test"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="9"android:targetSdkVersion="9"/>
<application android:icon="@drawable/icon"android:label="@string/app_name">
<!-- 本地服务LocalService -->
<service android:name="LocalService" />
<!-- 启动类型服务的Activity,内部类Controller-->
<activity android:name=".LocalServiceActivities$Controller"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 绑定类型服务的Activity,要运行本服务,需要将下面的注释去掉,
同时给上面的启动类型服务的Activity给注释掉 -->
<!--
<activity android:name=".LocalServiceActivities$Binding"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
-->
</application>
</manifest>
2. 定义字符资源(strings.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, LocalServiceActivity!</string>
<string name="app_name">LocalServiceApp</string>
<stringname="activity_local_service_controller">App/Service/Local Service Controller</string>
<string name="local_service_controller">This demonstrates how you can implement persistent services that
may be started and stopped as desired.</string>
<string name="start_service">Start Service</string>
<string name="stop_service">Stop Service</string>

<string name="local_service_started">Local service has started</string>
<string name="local_service_stopped">Local service has stopped</string>
<string name="local_service_label">Sample Local Service</string>

<stringname="activity_local_service_binding">App/Service/Local Service Binding</string>
<string name="local_service_binding">This demonstrates how you can connect with a persistent
service. Notice how it automatically starts for you, and play around with the
interaction between this and Local Service Controller.</string>
<string name="bind_service">Bind Service</string>
<string name="unbind_service">Unbind Service</string>
<string name="local_service_connected">Connected to local service</string>
<string name="local_service_disconnected">Disconnected from local service</string>
</resources>
3. 定义布局资源
3.1. local_service_controller.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:padding="4dip"
android:gravity="center_horizontal"
android:layout_width="match_parent"android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"android:layout_height="wrap_content"
android:layout_weight="0"
android:paddingBottom="4dip"
android:text="@string/local_service_controller"/>
<Button android:id="@+id/start"
android:layout_width="wrap_content"android:layout_height="wrap_content"
android:text="@string/start_service">
<requestFocus />
</Button>
<Button android:id="@+id/stop"
android:layout_width="wrap_content"android:layout_height="wrap_content"
android:text="@string/stop_service">
</Button>
</LinearLayout>

❾ android 内部类的问题

把class前面那个static去掉

❿ android activity 调用service 怎么写

直接传activity 引用肯定是不行的,最简单的是 用静态全局变量 ,不过不推荐。所以只能复杂一点 ,不能service可以直接调用activity ,只能传消息给activity ,让activity 执行特定的方法。就是 service start activity 。而activity 设置为 single instance ,在newIntent 方法 里面 处理 传入消息。还有一个方法就是activity 里面定义 一个 内部类 broadcast ,然后 service 调用sendbraoadcast ,broadcast 再调用 activity 方法。

阅读全文

与androidservice内部类相关的资料

热点内容
新科学pdf 浏览:744
现在还有c语言编译吗 浏览:672
哪里买到单片机 浏览:478
linux文件打开数量 浏览:510
编译原理中什么是l属性文法 浏览:367
硬盘加密时出现的问题 浏览:59
如何退域命令 浏览:108
看书的app哪里看 浏览:291
服务器怎么调大 浏览:3
android天气apijson 浏览:984
为什么创建id会出现服务器错误 浏览:837
代码中有不必编译的单词吗 浏览:563
钩子与数据库编程 浏览:563
安卓光遇录歌怎么设置 浏览:485
虚拟机怎么和云服务器搭建集群 浏览:896
python倒计时代码turtle 浏览:492
cad命令mv 浏览:928
nexus7一代androidl 浏览:306
linux使用静态库编译过程 浏览:103
android平滑滚动效果 浏览:841