如何创建android系统服务

如何创建android系统服务,第1张

1、 撰写一个aidl文件定义服务的接口,将在编译过程中通过aidl工具生成对应的java接口。一般系统服务的aidl文件都放在framework\base\core\java\android\os目录中。

以我所写的IMyToolaidl为例。在aidl中定义自己需要加入的方法,编写规则和java接口差不多,这里不多说。

2、 将aidl文件名添加到frameworks\base\目录下的Androidmk编译脚本文件中。

如:

LOCAL_SRC_FILES += \

core/java/android/accessibilityservice/IAccessibilityServiceConnectionaidl\

…\

core/java/android/os/IMyToolaidl\

IMyToolaidl即我加进去的aidl文件,加入后才能在make过程中编译到,否则将在后面的SystemServer添加系统服务时会报错提示找不到对应类。

3、 编写真正工作的服务类,继承IMyToolStub类(AIDL文件名Stub,aidl生成的接口中的内部类,是一个Binder)。

服务类一般都放在framework\base\services\java\com\android\server目录中。

例如:

public class MyToolService extends IMyToolStub {

实现IMyToolaidl中定义的接口。

}

4、 将自定义服务注册到SystemServer,使得开机过程中被添加。

在framework\base\services\java\com\android\server目录中的SystemServer中启动服务代码处加入:

try {

Slogi(TAG, "MyToolService");

ServiceManageraddService(ContextMY_TOOL_SERVICE,new MyToolService(context));// MyToolService构造函数自己定义,一般都会用到Context

} catch(Throwable e) {

Sloge(TAG, "Failure startingMyToolService", e);

}

上面代码中ContextMY_TOOL_SERVICE是自己在Context类中定义的常量,也就是给服务定义的名字,使用常量方便获取服务,而不需要记住注册服务时用的名字,且想换名字时只需改一个常量的值。

import javaawt;

import javaawtevent;

import javaxswing;

import javatextDateFormat;

import javaxswingevent;

import javaxswingtable;

import javaxswingtree;

import javaxswingfilechooser;

import javaio;

import javautil;

public class WinExplorer extends JFrame implements TreeSelectionListener{

JPanel contentPane=(JPanel)getContentPane();;

JMenuBar menuBar = new JMenuBar();

JMenu menuFile = new JMenu("文件");

JMenuItem menuItemExit = new JMenuItem("退出");

JToolBar toolBar = new JToolBar();

JButton bttUp = new JButton();

Icon iconUp=UIManagergetIcon("FileChooserupFolderIcon");

JLabel statusBar = new JLabel();

DetailTable detailTable = new DetailTable();

JScrollPane sp = new JScrollPane(detailTable);

JSplitPane split = new JSplitPane();

FileSystemView fileSystemView=FileSystemViewgetFileSystemView();

FileNode root=new FileNode(fileSystemViewgetRoots()[0]);

DefaultTreeModel treeModel=new DefaultTreeModel(root);

JTree tree = new JTree(treeModel);

public static void main(String argv[]){

try {

UIManagersetLookAndFeel(UIManagergetSystemLookAndFeelClassName());

Font font=new Font("宋体",FontPLAIN,12);

String names[]={"Label","CheckBox","PopupMenu","TextPane",

"MenuItem","CheckBoxMenuItem","JRadioButtonMenuItem",

"ComboBox","Button","Tree","ScrollPane","TabbedPane",

"EditorPane","TitledBorder","Menu","TextArea","OptionPane",

"MenuBar","ToolBar","ToggleButton","ToolTip","ProgressBar",

"TableHeader","Panel","List","ColorChooser","PasswordField",

"TextField","Table","Label","Viewport","RadioButtonMenuItem",

"RadioButton"};

for(int i=0;i<nameslength;i++)UIManagerput(names[i]+"font",font);

UIManagerput("Labelforeground",Colorblack);

UIManagerput("Borderforeground",Colorblack);

UIManagerput("TitledBordertitleColor",Colorblack);

new WinExplorer()show();

}catch(Exception e){

eprintStackTrace();

}

}

public WinExplorer() {

contentPanesetLayout(new BorderLayout());

Dimension dimension = getToolkit()getScreenSize();

int i = (dimensionwidth - 640) / 2;

int j = (dimensionheight - 480) / 2;

setBounds(i,j,640,480);

setTitle("资源管理器");

setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

setJMenuBar(menuBar);

statusBarsetText(" ");

menuItemExitaddActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {Systemexit(0);}

});

bttUpsetIcon(iconUp);

bttUpaddActionListener(new javaawteventActionListener() {

public void actionPerformed(ActionEvent e) {

try{

TreePath upPath=treegetSelectionPath()getParentPath();

if(upPath!=null){

treesetSelectionPath(upPath);

treescrollPathToVisible(upPath);

}

}catch(Exception ex){}

}

});

splitsetDividerSize(6);

splitsetLeftComponent(new JScrollPane(tree));

splitsetRightComponent(sp);

splitsetDividerLocation(180);

spgetViewport()setBackground(Colorwhite);

menuFileadd(menuItemExit);

menuBaradd(menuFile);

contentPaneadd(toolBar, BorderLayoutNORTH);

toolBaradd(bttUp, null);

contentPaneadd(statusBar, BorderLayoutSOUTH);

contentPaneadd(split, BorderLayoutCENTER);

treeaddTreeExpansionListener(new MyExpandsionListener());

treesetCellRenderer(new MyTreeCellRenderer());

treeaddTreeSelectionListener(this);

treesetSelectionRow(0);

treesetComponentOrientation(ComponentOrientationUNKNOWN);

}

public void valueChanged(TreeSelectionEvent e){

Object obj=treegetLastSelectedPathComponent();

if(obj==null)return;

else detailTablesetParent(((FileNode)obj)getFile());

}

class MyTreeCellRenderer extends DefaultTreeCellRenderer {

public MyTreeCellRenderer() {}

public Component getTreeCellRendererComponent(JTree tree,Object value,

boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus) {

supergetTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus);

setIcon(fileSystemViewgetSystemIcon(((FileNode)value)getFile()));

return this;

}

}

class MyExpandsionListener implements TreeExpansionListener {

public MyExpandsionListener() {}

public void treeExpanded(TreeExpansionEvent event) {

if(eventgetPath() == null){

return;

}

treesetCursor(new Cursor(CursorWAIT_CURSOR));

TreePath path = eventgetPath();

FileNode node = (FileNode)pathgetLastPathComponent();

nodeexplore();

treeModelnodeStructureChanged(node);

treesetCursor(new Cursor(CursorDEFAULT_CURSOR));

}

public void treeCollapsed(TreeExpansionEvent event) {}

}

class FileNode extends DefaultMutableTreeNode {

private boolean explored = false;

public FileNode(File file) { setUserObject(file); }

public boolean getAllowsChildren() { return isDirectory(); }

public boolean isLeaf() { return !isDirectory();}

public File getFile() { return (File)getUserObject(); }

public boolean isExplored() { return explored; }

public void setExplored(boolean b){ explored=b;}

public boolean isDirectory() { return getFile()isDirectory();}

public String toString() {

File file = (File)getUserObject();

String filename = filetoString();

int index = filenamelastIndexOf(Fileseparator);

return (index != -1 && index != filenamelength()-1)

filenamesubstring(index+1) : filename;

}

public void explore() {

if(!isExplored()) {

File file = getFile();

File[] children = filelistFiles();

if(children==null||childrenlength==0)return;

for(int i=0; i < childrenlength; ++i)

{

File f=children[i];

if(fisDirectory())add(new FileNode(children[i]));

}

explored = true;

}

}

}

class DetailTable extends JTable{

DetailTableModel model=new DetailTableModel();

public DetailTable(){

setModel(model);

setShowGrid(false);

TableColumnModel colModel = getColumnModel();

for (int i=0;i<3;i++)

colModelgetColumn(i)setCellRenderer(new DetailsTableCellRenderer());

setRowHeight(18);

thisaddMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent e) {

if(egetClickCount()==2){

for (int i = 0; i <getRowCount(); i++) {

if(getCellRect(i,0,true)contains(egetPoint())){

openSelect();

break;

}

}

}

}

});

}

public void openSelect(){

Object obj=modelgetValueAt(getSelectedRow(),0);

if(obj==null)return;

File f=(File)obj;

if(fisDirectory()){

//expand tree

}else{

//open select file

}

}

public void setParent(File parent){

modelremoveAllRows();

File list[]=parentlistFiles();

if(list==null)return;

Vector vDir=new Vector(),vFile=new Vector();

for (int i = 0; i < listlength; i++) {

if(list[i]isDirectory())vDiradd(list[i]);

else vFileadd(list[i]);

}

sortElements(vFile);

sortElements(vDir);

for (int i = 0; i < vDirsize(); i++)modeladdFile((File)vDirelementAt(i));

for (int i = 0; i < vFilesize(); i++)modeladdFile((File)vFileelementAt(i));

}

public void sortElements(Vector v)

{

for(int i=0;i<vsize();i++)

{

int k=i;

for(int j=i+1;j<vsize();j++){

File fa=(File)velementAt(j);

File fb=(File)velementAt(k);

if(fileSystemViewgetSystemDisplayName(fa)toLowerCase()compareTo(

fileSystemViewgetSystemDisplayName(fb)toLowerCase())<0)k=j;

}

if(k!=i)swap(k,i,v);

}

}

private void swap(int loc1,int loc2,Vector v){

Object tmp=velementAt(loc1);

vsetElementAt(velementAt(loc2),loc1);

vsetElementAt(tmp,loc2);

}

class DetailTableModel extends DefaultTableModel {

public DetailTableModel() {

addColumn("名称");

addColumn("大小");

addColumn("修改时间");

}

public void addFile(File f){

addRow(new Object[]{f,new Double(flength()/1024),

new javasqlDate(flastModified())});

}

public void removeAllRows(){

while(getRowCount()!=0) removeRow(0);

}

public boolean isCellEditable(int row, int column) {return false;}

}

class DetailsTableCellRenderer extends DefaultTableCellRenderer {

DetailsTableCellRenderer() {}

public Component getTableCellRendererComponent(JTable table, Object value,

boolean isSelected, boolean hasFocus, int row, int column) {

if (column == 1){

setHorizontalAlignment(SwingConstantsTRAILING);

isSelected=hasFocus=false;

}else if(column==2){

setHorizontalAlignment(SwingConstantsCENTER);

isSelected=hasFocus=false;

}else setHorizontalAlignment(SwingConstantsLEADING);

return supergetTableCellRendererComponent(

table, value, isSelected, hasFocus, row, column);

}

public void setValue(Object value) {

setIcon(null);

if (value instanceof File) {

File file = (File)value;

setText(fileSystemViewgetSystemDisplayName(file));

setIcon(fileSystemViewgetSystemIcon(file));

}else{

supersetValue(value);

}

}

}

}

}

你双击左面的桌面图标就可以浏览了,别双击字。

不清楚是否有这类软件,不过我的解决方法是不用其他软件就系统解决

1限制软件的运行。开始---运行---gpeditmsc(组策略)---用户配置---管理模板---系统---不要运行指定的windows程序---双击打开--点击已启用---添加---添加不要运行的程序名称包括扩展名---确定--重启。

2限制声音大小等。

开始--控制面板---realtek高清音频配置---在音效下的均衡器上所有的量都设置为最小。卡拉ok可以设置为负数这样声音就小多了,而且不怎么好听,混频器下的重放可以设置为最小,这样只有一个喇叭哦!呵呵

然后 再把realtek高清音频配置程序放到组策略中!就打不开了!

CDT配置好了编写makefile的方法:

在建立工程的时候选择makefile工程。

这是上面那个程序的Makefile文件:

main:maino mytool1o mytool2o

gcc -o main maino mytool1o mytool2o

maino:mainc mytool1h mytool2h

gcc -c mainc

mytool1o:mytool1c mytool1h

gcc -c mytool1c

mytool2o:mytool2c mytool2h

gcc -c mytool2c

去安卓各大市场下载安装My Android Tools即可。

My Android Tools专业版功能(支持 android 50(Lollipop)):

1启用/禁用组件(活动,服务,接收器,提供者)

★红色:禁用。

★蓝色:当前正在运行(仅服务)

2显示所有正在运行的进程和任务

3显示日志

4显示所有应用程序的分享偏好和数据库

★活动:每个活动各代表一个单独的用户界面

★服务:每个服务各代表一个在后台运行的组件以执行长时间运行的 *** 作或执行远程进程的工作

★提供器:每个提供器各管理一组共享的应用数据。通过提供器,其他应用可以查询或甚至更改数据

★接收器:每个接收器各是一个响应全系统广播的组件

★共享偏好:以键值对来存储原始数据My Android Tools应该说是一款神器,能干的事情很爽,遇到一些个流氓app,这东西有用。

JAVA的File类中有个方法是可以判断文件是否存在的,就是exists()这个方法,如果是文件的话可以用createNewFile()这个方法新建一个文件,如果新建的是文件夹可以用mkdir()这个方法

在编写makefile后,make项目时提示错误“Makefile:3: missing separator Stop”

偶然发现这个错误是有makefile中的tab的长度导致的,在makefile中的命令需要以tab键开始,

在vimrc文件中发现没有设置tab键的默认长度,然后在vimrc中添加如下配置后,

set tabstop=4

便可以执行makefile了, 但是后来发现不管再次把tabstop设置成8还是注释掉这个配置,makefile都可以执行,很奇怪,不知道为什么?

这是从 网络上搜索到的 看看对你是否用用???????

以上就是关于如何创建android系统服务全部的内容,包括:如何创建android系统服务、急需一段java小程序、200分求一小程序!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10123326.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存