
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分求一小程序!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)